<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<meta name="keywords" content="anhoder的进阶日志">
<meta name="description" content="一川烟草，满城风絮。">
<meta name="theme-color" content="#000">
<title>后端架构师技术图谱【转】 | anhoder的进阶日志</title>
<link rel="shortcut icon" href="/favicon.ico?v=1640406618472">
<link rel="stylesheet" href="/media/css/pisces.css">
<link rel="stylesheet" href="/media/fonts/font-awesome.css">
<link
  href="//fonts.googleapis.com/css?family=Monda:300,300italic,400,400italic,700,700italic|Roboto Slab:300,300italic,400,400italic,700,700italic|Rosario:300,300italic,400,400italic,700,700italic|PT Mono:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext"
  rel="stylesheet" type="text/css">

<link href="/media/hljs/styles/androidstudio.css"
  rel="stylesheet">

<script src="https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/pace-js@1.0.2/themes/green/pace-theme-minimal.css" rel="stylesheet" />

<link rel="stylesheet" href="/styles/main.css">

<script src="/media/hljs/highlight.js"></script>
<script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.0/velocity.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/velocity-animate@1.5.0/velocity.ui.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.css"
  integrity="sha384-zB1R0rpPzHqg7Kpt0Aljp8JPLqbXI3bhnPWROx27a9N0Ll6ZP/+DiW/UqRcLbRjq" crossorigin="anonymous">


<script defer src="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.js"
  integrity="sha384-y23I5Q6l+B6vatafAwxRu/0oK/79VlbSz7Q9aiSZUvyWYIYsd+qj+o24G5ZU2zJz" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/contrib/auto-render.min.js"
  integrity="sha384-kWPLUVMOks5AQFrykwIup5lo0m3iMkkHrD0uJ4H5cjeGihAutqP0yW0J6dpFiVkI" crossorigin="anonymous"
  onload="renderMathInElement(document.body);"></script>



<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-161423102-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag() { dataLayer.push(arguments); }
  gtag('js', new Date());

  gtag('config', 'UA-161423102-1');
</script>


<script>
  var _hmt = _hmt || [];
  (function () {
    var hm = document.createElement("script");
    hm.src = "https://hm.baidu.com/hm.js?bdf14d3cd277bc2dfa9f84d19b36a686";
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(hm, s);
  })();
</script>


  <meta name="description" content="后端架构师技术图谱【转】" />
  <meta name="keywords" content="PHP" />
</head>

<body>
  <div class="head-top-line"></div>
  <div class="header-box">
    
<div class="pisces">
  <header class="header  ">
    <div class="blog-header box-shadow-wrapper bg-color " id="header">
      <div class="nav-toggle" id="nav_toggle">
        <div class="toggle-box">
          <div class="line line-top"></div>
          <div class="line line-center"></div>
          <div class="line line-bottom"></div>
        </div>
      </div>
      <div class="site-meta">       
        <div class="site-title">
          
            <a href="/" class="brand">
              <span>anhoder的进阶日志</span>
            </a>  
          
        </div>
        
          <p class="subtitle">太阳不热，糖也正适合。</p>
        
      </div>
      <nav class="site-nav" id="site_nav">
        <ul id="nav_ul">
          
            
            
            <li class="nav-item ">
              
              
                
                  <a href="/" target="_self">
                    <i class="fa fa-home"></i> 首页
                  </a>
                
              
            </li>
          
            
            
            <li class="nav-item ">
              
              
                
                  <a href="/archives/" target="_self">
                    <i class="fa fa-archive"></i> 归档
                  </a>
                
              
            </li>
          
            
            
            <li class="nav-item ">
              
              
                
                  <a href="/tags/" target="_self">
                    <i class="fa fa-tags"></i> 标签
                  </a>
                
              
            </li>
          
            
            
            <li class="nav-item ">
              
              
                
                  <a href="/post/about/" target="_self">
                    <i class="fa fa-user"></i> 关于
                  </a>
                
              
            </li>
          
            
            
            <li class="nav-item ">
              
              
                
                  <a href="https://github.com/anhoder/" target="_blank">
                    <i class="fa fa-github"></i> GitHub
                  </a>
                
              
            </li>
          
            
            
            <li class="nav-item ">
              
              
                
                  <a href="/media/excalidraw/" target="_self">
                    <i class="fa fa-picture-o"></i> 制作手绘图
                  </a>
                
              
            </li>
          
          
          
        </ul>
      </nav>
    </div>
  </header>
</div>

<script type="text/javascript"> 
 
  let showNav = true;

  let navToggle = document.querySelector('#nav_toggle'),
  siteNav = document.querySelector('#site_nav');
  
  function navClick() {
    let sideBar = document.querySelector('.sidebar');
    let navUl = document.querySelector('#nav_ul');
    navToggle.classList.toggle('nav-toggle-active');
    siteNav.classList.toggle('nav-menu-active');
    if (siteNav.classList.contains('nav-menu-active')) {
      siteNav.style = "height: " + (navUl.children.length * 42) +"px !important";
    } else {
      siteNav.style = "";
    }
  }

  navToggle.addEventListener('click',navClick);  
</script>
  </div>
  <div class="main-continer">
    
    <div
      class="section-layout pisces ">
      <div class="section-layout-wrapper">
        

<div class="sidebar">
  
    <div class="sidebar-box box-shadow-wrapper bg-color right-motion" id="sidebar">
      
        <div class="post-list-sidebar">
          <div class="sidebar-title">
            <span id="tocSideBar" class="sidebar-title-item sidebar-title-active language" data-lan="index">文章目录</span>
            <span id="metaSideBar" class="sidebar-title-item language" data-lan="preview">站点概览</span>
          </div>
        </div>
      
      <div class="sidebar-body pisces" id="sidebar_body">
        
          
            <div class="post-side-meta" id="post_side_meta">
              
<div class="sidebar-wrapper box-shadow-wrapper bg-color">
  <div class="sidebar-item">
    <img class="site-author-image right-motion" src="/images/avatar.png"/>
    <p class="site-author-name">anhoder</p>
    
  </div>
  <div class="sidebar-item side-item-stat right-motion">
    <div class="sidebar-item-box">
      <a href="/archives/">
        
        <span class="site-item-stat-count">94</span>
        <span class="site-item-stat-name language" data-lan="article">文章</span>
      </a>
    </div>
    <div class="sidebar-item-box">
      <a href="">
        <span class="site-item-stat-count">27</span>
        <span class="site-item-stat-name language" data-lan="category">分类</span>
      </a>
    </div>
    <div class="sidebar-item-box">
      <a href="/tags/">
        <span class="site-item-stat-count">27</span>
        <span class="site-item-stat-name language" data-lan="tag">标签</span>
      </a>
    </div>
  </div>
  
    
  
  
    <div class="sidebar-item sidebar-item-social">
      <div class="social-item">
        
          
            <a href="https://github.com/anhoder">
              <i class="fa fa-github-alt" title="GitHub"></i>
            </a>
          
            <a href="https://twitter.com/Alan_Albert_">
              <i class="fa fa-twitter" title="Twitter"></i>
            </a>
          
            <a href="https://weibo.com/u/5794659803">
              <i class="fa fa-weibo" title="Weibo"></i>
            </a>
          
            <a href="mailto:anhoder@88.com">
              <i class="fa fa-envelope" title="Email"></i>
            </a>
          
            <a href="https://stackoverflow.com/users/9723854/alan">
              <i class="fa fa-stack-overflow" title="StackOverflow"></i>
            </a>
          
        
        
          
            <a class="social-img" href="#">
              <img src="/media/images/custom-array-imgSocials-1617614181832-socialImg.png" />
              <i class="fa fa-weixin" title="微信公众号" ></i>
            </a>
          
        
      </div>
    </div>
  

  



</div>
            </div>
            <div class="post-toc sidebar-body-active" id="post_toc" style="opacity: 1;">
              <div class="toc-box right-motion">
  <div class="toc-wrapper  auto"
    id="toc_wrapper">
    <ul class="markdownIt-TOC">
<li><a href="#%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84">数据结构</a>
<ul>
<li><a href="#%E9%98%9F%E5%88%97">队列</a></li>
<li><a href="#%E9%9B%86%E5%90%88">集合</a></li>
<li><a href="#%E9%93%BE%E8%A1%A8-%E6%95%B0%E7%BB%84">链表、数组</a></li>
<li><a href="#%E5%AD%97%E5%85%B8-%E5%85%B3%E8%81%94%E6%95%B0%E7%BB%84">字典、关联数组</a></li>
<li><a href="#%E6%A0%88">栈</a></li>
<li><a href="#%E6%A0%91">树</a>
<ul>
<li><a href="#%E4%BA%8C%E5%8F%89%E6%A0%91">二叉树</a></li>
<li><a href="#%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91">完全二叉树</a></li>
<li><a href="#%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91">平衡二叉树</a></li>
<li><a href="#%E4%BA%8C%E5%8F%89%E6%9F%A5%E6%89%BE%E6%A0%91bst">二叉查找树（BST）</a></li>
<li><a href="#%E7%BA%A2%E9%BB%91%E6%A0%91">红黑树</a></li>
<li><a href="#b-bb%E6%A0%91">B-，B+，B*树</a></li>
<li><a href="#lsm-%E6%A0%91">LSM 树</a></li>
</ul>
</li>
<li><a href="#bitset">BitSet</a></li>
</ul>
</li>
<li><a href="#%E5%B8%B8%E7%94%A8%E7%AE%97%E6%B3%95">常用算法</a>
<ul>
<li><a href="#%E6%8E%92%E5%BA%8F-%E6%9F%A5%E6%89%BE%E7%AE%97%E6%B3%95">排序、查找算法</a>
<ul>
<li><a href="#%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F">选择排序</a></li>
<li><a href="#%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F">冒泡排序</a></li>
<li><a href="#%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F">插入排序</a></li>
<li><a href="#%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F">快速排序</a></li>
<li><a href="#%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F">归并排序</a></li>
<li><a href="#%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F">希尔排序</a></li>
<li><a href="#%E5%A0%86%E6%8E%92%E5%BA%8F">堆排序</a></li>
<li><a href="#%E8%AE%A1%E6%95%B0%E6%8E%92%E5%BA%8F">计数排序</a></li>
<li><a href="#%E6%A1%B6%E6%8E%92%E5%BA%8F">桶排序</a></li>
<li><a href="#%E5%9F%BA%E6%95%B0%E6%8E%92%E5%BA%8F">基数排序</a></li>
<li><a href="#%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE">二分查找</a></li>
<li><a href="#java-%E4%B8%AD%E7%9A%84%E6%8E%92%E5%BA%8F%E5%B7%A5%E5%85%B7">Java 中的排序工具</a></li>
</ul>
</li>
<li><a href="#%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8">布隆过滤器</a></li>
<li><a href="#%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%AF%94%E8%BE%83">字符串比较</a>
<ul>
<li><a href="#kmp-%E7%AE%97%E6%B3%95">KMP 算法</a></li>
</ul>
</li>
<li><a href="#%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88-%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88">深度优先、广度优先</a></li>
<li><a href="#%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95">贪心算法</a></li>
<li><a href="#%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95">回溯算法</a></li>
<li><a href="#%E5%89%AA%E6%9E%9D%E7%AE%97%E6%B3%95">剪枝算法</a></li>
<li><a href="#%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92">动态规划</a></li>
<li><a href="#%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF">朴素贝叶斯</a></li>
<li><a href="#%E6%8E%A8%E8%8D%90%E7%AE%97%E6%B3%95">推荐算法</a></li>
<li><a href="#%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91%E7%AE%97%E6%B3%95">最小生成树算法</a></li>
<li><a href="#%E6%9C%80%E7%9F%AD%E8%B7%AF%E5%BE%84%E7%AE%97%E6%B3%95">最短路径算法</a></li>
</ul>
</li>
<li><a href="#%E5%B9%B6%E5%8F%91">并发</a>
<ul>
<li><a href="#java-%E5%B9%B6%E5%8F%91">Java 并发</a></li>
<li><a href="#%E5%A4%9A%E7%BA%BF%E7%A8%8B">多线程</a></li>
<li><a href="#%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8">线程安全</a></li>
<li><a href="#%E4%B8%80%E8%87%B4%E6%80%A7-%E4%BA%8B%E5%8A%A1">一致性、事务</a>
<ul>
<li><a href="#%E4%BA%8B%E5%8A%A1-acid-%E7%89%B9%E6%80%A7">事务 ACID 特性</a></li>
<li><a href="#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB">事务的隔离级别</a></li>
<li><a href="#mvcc">MVCC</a></li>
</ul>
</li>
<li><a href="#%E9%94%81">锁</a>
<ul>
<li><a href="#java%E4%B8%AD%E7%9A%84%E9%94%81%E5%92%8C%E5%90%8C%E6%AD%A5%E7%B1%BB">Java中的锁和同步类</a></li>
<li><a href="#%E5%85%AC%E5%B9%B3%E9%94%81-%E9%9D%9E%E5%85%AC%E5%B9%B3%E9%94%81">公平锁 &amp; 非公平锁</a></li>
<li><a href="#%E6%82%B2%E8%A7%82%E9%94%81">悲观锁</a></li>
<li><a href="#%E4%B9%90%E8%A7%82%E9%94%81-cas">乐观锁 &amp; CAS</a></li>
<li><a href="#aba-%E9%97%AE%E9%A2%98">ABA 问题</a></li>
<li><a href="#copyonwrite%E5%AE%B9%E5%99%A8">CopyOnWrite容器</a></li>
<li><a href="#ringbuffer">RingBuffer</a></li>
<li><a href="#%E5%8F%AF%E9%87%8D%E5%85%A5%E9%94%81-%E4%B8%8D%E5%8F%AF%E9%87%8D%E5%85%A5%E9%94%81">可重入锁 &amp; 不可重入锁</a></li>
<li><a href="#%E4%BA%92%E6%96%A5%E9%94%81-%E5%85%B1%E4%BA%AB%E9%94%81">互斥锁 &amp; 共享锁</a></li>
<li><a href="#%E6%AD%BB%E9%94%81">死锁</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F">操作系统</a>
<ul>
<li><a href="#%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%8E%9F%E7%90%86">计算机原理</a></li>
<li><a href="#cpu">CPU</a>
<ul>
<li><a href="#%E5%A4%9A%E7%BA%A7%E7%BC%93%E5%AD%98">多级缓存</a></li>
</ul>
</li>
<li><a href="#%E8%BF%9B%E7%A8%8B">进程</a></li>
<li><a href="#%E7%BA%BF%E7%A8%8B">线程</a></li>
<li><a href="#%E5%8D%8F%E7%A8%8B">协程</a></li>
<li><a href="#linux">Linux</a></li>
</ul>
</li>
<li><a href="#%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F">设计模式</a>
<ul>
<li><a href="#%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E7%9A%84%E5%85%AD%E5%A4%A7%E5%8E%9F%E5%88%99">设计模式的六大原则</a></li>
<li><a href="#23%E7%A7%8D%E5%B8%B8%E8%A7%81%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F">23种常见设计模式</a></li>
<li><a href="#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF">应用场景</a></li>
<li><a href="#%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F">单例模式</a></li>
<li><a href="#%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F">责任链模式</a></li>
<li><a href="#mvc">MVC</a></li>
<li><a href="#ioc">IOC</a></li>
<li><a href="#aop">AOP</a></li>
<li><a href="#uml">UML</a></li>
<li><a href="#%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%80%9D%E6%83%B3">微服务思想</a>
<ul>
<li><a href="#%E5%BA%B7%E5%A8%81%E5%AE%9A%E5%BE%8B">康威定律</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#%E8%BF%90%E7%BB%B4-%E7%BB%9F%E8%AE%A1-%E6%8A%80%E6%9C%AF%E6%94%AF%E6%8C%81">运维 &amp; 统计 &amp; 技术支持</a>
<ul>
<li><a href="#%E5%B8%B8%E8%A7%84%E7%9B%91%E6%8E%A7">常规监控</a></li>
<li><a href="#apm">APM</a></li>
<li><a href="#%E7%BB%9F%E8%AE%A1%E5%88%86%E6%9E%90">统计分析</a></li>
<li><a href="#%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90cicd">持续集成(CI/CD)</a>
<ul>
<li><a href="#jenkins">Jenkins</a></li>
<li><a href="#%E7%8E%AF%E5%A2%83%E5%88%86%E7%A6%BB">环境分离</a></li>
</ul>
</li>
<li><a href="#%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4">自动化运维</a>
<ul>
<li><a href="#ansible">Ansible</a></li>
<li><a href="#puppet">puppet</a></li>
<li><a href="#chef">chef</a></li>
</ul>
</li>
<li><a href="#%E6%B5%8B%E8%AF%95">测试</a>
<ul>
<li><a href="#tdd-%E7%90%86%E8%AE%BA">TDD 理论</a></li>
<li><a href="#%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95">单元测试</a></li>
<li><a href="#%E5%8E%8B%E5%8A%9B%E6%B5%8B%E8%AF%95">压力测试</a></li>
<li><a href="#%E5%85%A8%E9%93%BE%E8%B7%AF%E5%8E%8B%E6%B5%8B">全链路压测</a></li>
<li><a href="#ab-%E7%81%B0%E5%BA%A6-%E8%93%9D%E7%BB%BF%E6%B5%8B%E8%AF%95">A/B 、灰度、蓝绿测试</a></li>
</ul>
</li>
<li><a href="#%E8%99%9A%E6%8B%9F%E5%8C%96">虚拟化</a>
<ul>
<li><a href="#kvm">KVM</a></li>
<li><a href="#xen">Xen</a></li>
<li><a href="#openvz">OpenVZ</a></li>
</ul>
</li>
<li><a href="#%E5%AE%B9%E5%99%A8%E6%8A%80%E6%9C%AF">容器技术</a>
<ul>
<li><a href="#docker">Docker</a></li>
</ul>
</li>
<li><a href="#%E4%BA%91%E6%8A%80%E6%9C%AF">云技术</a>
<ul>
<li><a href="#openstack">OpenStack</a></li>
</ul>
</li>
<li><a href="#devops">DevOps</a></li>
<li><a href="#%E6%96%87%E6%A1%A3%E7%AE%A1%E7%90%86">文档管理</a></li>
</ul>
</li>
<li><a href="#%E4%B8%AD%E9%97%B4%E4%BB%B6">中间件</a>
<ul>
<li><a href="#web-server">Web Server</a>
<ul>
<li><a href="#nginx">Nginx</a></li>
<li><a href="#openresty">OpenResty</a></li>
<li><a href="#apache-httpd">Apache Httpd</a></li>
<li><a href="#tomcat">Tomcat</a>
<ul>
<li><a href="#%E6%9E%B6%E6%9E%84%E5%8E%9F%E7%90%86">架构原理</a></li>
<li><a href="#%E8%B0%83%E4%BC%98%E6%96%B9%E6%A1%88">调优方案</a></li>
</ul>
</li>
<li><a href="#jetty">Jetty</a></li>
</ul>
</li>
<li><a href="#%E7%BC%93%E5%AD%98">缓存</a>
<ul>
<li><a href="#%E6%9C%AC%E5%9C%B0%E7%BC%93%E5%AD%98">本地缓存</a></li>
</ul>
</li>
<li><a href="#%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%BC%93%E5%AD%98">客户端缓存</a></li>
<li><a href="#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%BC%93%E5%AD%98">服务端缓存</a>
<ul>
<li><a href="#web%E7%BC%93%E5%AD%98">Web缓存</a></li>
<li><a href="#memcached">Memcached</a></li>
<li><a href="#redis">Redis</a>
<ul>
<li><a href="#%E6%9E%B6%E6%9E%84">架构</a></li>
<li><a href="#%E5%9B%9E%E6%94%B6%E7%AD%96%E7%95%A5">回收策略</a></li>
</ul>
</li>
<li><a href="#tair">Tair</a></li>
</ul>
</li>
<li><a href="#%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97">消息队列</a>
<ul>
<li><a href="#%E6%B6%88%E6%81%AF%E6%80%BB%E7%BA%BF">消息总线</a></li>
<li><a href="#%E6%B6%88%E6%81%AF%E7%9A%84%E9%A1%BA%E5%BA%8F">消息的顺序</a></li>
<li><a href="#rabbitmq">RabbitMQ</a></li>
<li><a href="#rocketmq">RocketMQ</a></li>
<li><a href="#activemq">ActiveMQ</a></li>
<li><a href="#kafka">Kafka</a></li>
<li><a href="#redis-%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%81">Redis 消息推送</a></li>
<li><a href="#zeromq">ZeroMQ</a></li>
</ul>
</li>
<li><a href="#%E5%AE%9A%E6%97%B6%E8%B0%83%E5%BA%A6">定时调度</a>
<ul>
<li><a href="#%E5%8D%95%E6%9C%BA%E5%AE%9A%E6%97%B6%E8%B0%83%E5%BA%A6">单机定时调度</a></li>
<li><a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E5%AE%9A%E6%97%B6%E8%B0%83%E5%BA%A6">分布式定时调度</a></li>
</ul>
</li>
<li><a href="#rpc">RPC</a>
<ul>
<li><a href="#dubbo">Dubbo</a></li>
<li><a href="#thrift">Thrift</a></li>
<li><a href="#grpc">gRPC</a></li>
</ul>
</li>
<li><a href="#%E6%95%B0%E6%8D%AE%E5%BA%93%E4%B8%AD%E9%97%B4%E4%BB%B6">数据库中间件</a>
<ul>
<li><a href="#sharding-jdbc">Sharding Jdbc</a></li>
</ul>
</li>
<li><a href="#%E6%97%A5%E5%BF%97%E7%B3%BB%E7%BB%9F">日志系统</a>
<ul>
<li><a href="#%E6%97%A5%E5%BF%97%E6%90%9C%E9%9B%86">日志搜集</a></li>
</ul>
</li>
<li><a href="#%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83">配置中心</a></li>
<li><a href="#api-%E7%BD%91%E5%85%B3">API 网关</a></li>
</ul>
</li>
<li><a href="#%E7%BD%91%E7%BB%9C">网络</a>
<ul>
<li><a href="#%E5%8D%8F%E8%AE%AE">协议</a>
<ul>
<li><a href="#osi-%E4%B8%83%E5%B1%82%E5%8D%8F%E8%AE%AE">OSI 七层协议</a></li>
<li><a href="#tcpip">TCP/IP</a></li>
<li><a href="#http">HTTP</a></li>
<li><a href="#http20">HTTP2.0</a></li>
<li><a href="#https">HTTPS</a></li>
</ul>
</li>
<li><a href="#%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B">网络模型</a>
<ul>
<li><a href="#epoll">Epoll</a></li>
<li><a href="#java-nio">Java NIO</a></li>
<li><a href="#kqueue">kqueue</a></li>
</ul>
</li>
<li><a href="#%E8%BF%9E%E6%8E%A5%E5%92%8C%E7%9F%AD%E8%BF%9E%E6%8E%A5">连接和短连接</a></li>
<li><a href="#%E6%A1%86%E6%9E%B6">框架</a></li>
<li><a href="#%E9%9B%B6%E6%8B%B7%E8%B4%9Dzero-copy">零拷贝（Zero-copy）</a></li>
<li><a href="#%E5%BA%8F%E5%88%97%E5%8C%96%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8D%8F%E8%AE%AE">序列化(二进制协议)</a>
<ul>
<li><a href="#hessian">Hessian</a></li>
<li><a href="#protobuf">Protobuf</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#%E6%95%B0%E6%8D%AE%E5%BA%93">数据库</a>
<ul>
<li><a href="#%E5%9F%BA%E7%A1%80%E7%90%86%E8%AE%BA">基础理论</a>
<ul>
<li><a href="#%E6%95%B0%E6%8D%AE%E5%BA%93%E8%AE%BE%E8%AE%A1%E7%9A%84%E4%B8%89%E5%A4%A7%E8%8C%83%E5%BC%8F">数据库设计的三大范式</a></li>
</ul>
</li>
<li><a href="#mysql">MySQL</a>
<ul>
<li><a href="#%E5%8E%9F%E7%90%86">原理</a></li>
<li><a href="#innodb">InnoDB</a></li>
<li><a href="#%E4%BC%98%E5%8C%96">优化</a></li>
<li><a href="#%E7%B4%A2%E5%BC%95">索引</a>
<ul>
<li><a href="#%E8%81%9A%E9%9B%86%E7%B4%A2%E5%BC%95-%E9%9D%9E%E8%81%9A%E9%9B%86%E7%B4%A2%E5%BC%95">聚集索引, 非聚集索引</a></li>
<li><a href="#%E5%A4%8D%E5%90%88%E7%B4%A2%E5%BC%95">复合索引</a></li>
<li><a href="#%E8%87%AA%E9%80%82%E5%BA%94%E5%93%88%E5%B8%8C%E7%B4%A2%E5%BC%95ahi">自适应哈希索引(AHI)</a></li>
</ul>
</li>
<li><a href="#explain">explain</a></li>
</ul>
</li>
<li><a href="#nosql">NoSQL</a>
<ul>
<li><a href="#mongodb">MongoDB</a></li>
<li><a href="#hbase">Hbase</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E">搜索引擎</a>
<ul>
<li><a href="#%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E5%8E%9F%E7%90%86">搜索引擎原理</a></li>
<li><a href="#lucene">Lucene</a></li>
<li><a href="#elasticsearch">Elasticsearch</a></li>
<li><a href="#solr">Solr</a></li>
<li><a href="#sphinx">sphinx</a></li>
</ul>
</li>
<li><a href="#%E6%80%A7%E8%83%BD">性能</a>
<ul>
<li><a href="#%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E6%96%B9%E6%B3%95%E8%AE%BA">性能优化方法论</a></li>
<li><a href="#%E5%AE%B9%E9%87%8F%E8%AF%84%E4%BC%B0">容量评估</a></li>
<li><a href="#cdn-%E7%BD%91%E7%BB%9C">CDN 网络</a></li>
<li><a href="#%E8%BF%9E%E6%8E%A5%E6%B1%A0">连接池</a></li>
<li><a href="#%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98">性能调优</a></li>
</ul>
</li>
<li><a href="#%E5%A4%A7%E6%95%B0%E6%8D%AE">大数据</a>
<ul>
<li><a href="#%E6%B5%81%E5%BC%8F%E8%AE%A1%E7%AE%97">流式计算</a>
<ul>
<li><a href="#storm">Storm</a></li>
<li><a href="#flink">Flink</a></li>
<li><a href="#kafka-stream">Kafka Stream</a></li>
<li><a href="#%E5%BA%94%E7%94%A8%E5%9C%BA%E6%99%AF-2">应用场景</a></li>
</ul>
</li>
<li><a href="#hadoop">Hadoop</a>
<ul>
<li><a href="#hdfs">HDFS</a></li>
<li><a href="#mapreduce">MapReduce</a></li>
<li><a href="#yarn">Yarn</a></li>
</ul>
</li>
<li><a href="#spark">Spark</a></li>
</ul>
</li>
<li><a href="#%E5%AE%89%E5%85%A8">安全</a>
<ul>
<li><a href="#web-%E5%AE%89%E5%85%A8">web 安全</a>
<ul>
<li><a href="#xss">XSS</a></li>
<li><a href="#csrf">CSRF</a></li>
<li><a href="#sql-%E6%B3%A8%E5%85%A5">SQL 注入</a></li>
<li><a href="#hash-dos">Hash Dos</a></li>
<li><a href="#%E8%84%9A%E6%9C%AC%E6%B3%A8%E5%85%A5">脚本注入</a></li>
<li><a href="#%E6%BC%8F%E6%B4%9E%E6%89%AB%E6%8F%8F%E5%B7%A5%E5%85%B7">漏洞扫描工具</a></li>
<li><a href="#%E9%AA%8C%E8%AF%81%E7%A0%81">验证码</a></li>
</ul>
</li>
<li><a href="#ddos-%E9%98%B2%E8%8C%83">DDoS 防范</a></li>
<li><a href="#%E7%94%A8%E6%88%B7%E9%9A%90%E7%A7%81%E4%BF%A1%E6%81%AF%E4%BF%9D%E6%8A%A4">用户隐私信息保护</a></li>
<li><a href="#%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E">序列化漏洞</a></li>
<li><a href="#%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86">加密解密</a>
<ul>
<li><a href="#%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86">对称加密</a></li>
<li><a href="#%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95">哈希算法</a></li>
<li><a href="#%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86">非对称加密</a></li>
</ul>
</li>
<li><a href="#%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E5%85%A8">服务器安全</a></li>
<li><a href="#%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8">数据安全</a>
<ul>
<li><a href="#%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD">数据备份</a></li>
</ul>
</li>
<li><a href="#%E7%BD%91%E7%BB%9C%E9%9A%94%E7%A6%BB">网络隔离</a>
<ul>
<li><a href="#%E5%86%85%E5%A4%96%E7%BD%91%E5%88%86%E7%A6%BB">内外网分离</a></li>
<li><a href="#%E7%99%BB%E5%BD%95%E8%B7%B3%E6%9D%BF%E6%9C%BA">登录跳板机</a></li>
</ul>
</li>
<li><a href="#%E6%8E%88%E6%9D%83-%E8%AE%A4%E8%AF%81">授权、认证</a>
<ul>
<li><a href="#rbac">RBAC</a></li>
<li><a href="#oauth20">OAuth2.0</a></li>
<li><a href="#%E5%8F%8C%E5%9B%A0%E7%B4%A0%E8%AE%A4%E8%AF%812fa">双因素认证（2FA）</a></li>
<li><a href="#%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95sso">单点登录(SSO)</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#%E5%B8%B8%E7%94%A8%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6">常用开源框架</a>
<ul>
<li><a href="#%E5%BC%80%E6%BA%90%E5%8D%8F%E8%AE%AE">开源协议</a></li>
<li><a href="#%E6%97%A5%E5%BF%97%E6%A1%86%E6%9E%B6">日志框架</a>
<ul>
<li><a href="#log4j-log4j2">Log4j、Log4j2</a></li>
<li><a href="#logback">Logback</a></li>
</ul>
</li>
<li><a href="#orm">ORM</a></li>
<li><a href="#%E7%BD%91%E7%BB%9C%E6%A1%86%E6%9E%B6">网络框架</a></li>
<li><a href="#web-%E6%A1%86%E6%9E%B6">Web 框架</a>
<ul>
<li><a href="#spring-%E5%AE%B6%E6%97%8F">Spring 家族</a></li>
</ul>
</li>
<li><a href="#%E5%B7%A5%E5%85%B7%E6%A1%86%E6%9E%B6">工具框架</a></li>
</ul>
</li>
<li><a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%BE%E8%AE%A1">分布式设计</a>
<ul>
<li><a href="#%E6%89%A9%E5%B1%95%E6%80%A7%E8%AE%BE%E8%AE%A1">扩展性设计</a></li>
<li><a href="#%E7%A8%B3%E5%AE%9A%E6%80%A7-%E9%AB%98%E5%8F%AF%E7%94%A8">稳定性 &amp; 高可用</a>
<ul>
<li><a href="#%E7%A1%AC%E4%BB%B6%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1">硬件负载均衡</a></li>
<li><a href="#%E8%BD%AF%E4%BB%B6%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1">软件负载均衡</a></li>
<li><a href="#%E9%99%90%E6%B5%81">限流</a></li>
<li><a href="#%E5%BA%94%E7%94%A8%E5%B1%82%E5%AE%B9%E7%81%BE">应用层容灾</a></li>
<li><a href="#%E8%B7%A8%E6%9C%BA%E6%88%BF%E5%AE%B9%E7%81%BE">跨机房容灾</a></li>
<li><a href="#%E5%AE%B9%E7%81%BE%E6%BC%94%E7%BB%83%E6%B5%81%E7%A8%8B">容灾演练流程</a></li>
<li><a href="#%E5%B9%B3%E6%BB%91%E5%90%AF%E5%8A%A8">平滑启动</a></li>
</ul>
</li>
<li><a href="#%E6%95%B0%E6%8D%AE%E5%BA%93%E6%89%A9%E5%B1%95">数据库扩展</a>
<ul>
<li><a href="#%E8%AF%BB%E5%86%99%E5%88%86%E7%A6%BB%E6%A8%A1%E5%BC%8F">读写分离模式</a></li>
<li><a href="#%E5%88%86%E7%89%87%E6%A8%A1%E5%BC%8F">分片模式</a></li>
</ul>
</li>
<li><a href="#%E6%9C%8D%E5%8A%A1%E6%B2%BB%E7%90%86">服务治理</a>
<ul>
<li><a href="#%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E4%B8%8E%E5%8F%91%E7%8E%B0">服务注册与发现</a></li>
<li><a href="#%E6%9C%8D%E5%8A%A1%E8%B7%AF%E7%94%B1%E6%8E%A7%E5%88%B6">服务路由控制</a></li>
</ul>
</li>
<li><a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%80%E8%87%B4">分布式一致</a>
<ul>
<li><a href="#cap-%E4%B8%8E-base-%E7%90%86%E8%AE%BA">CAP 与 BASE 理论</a></li>
<li><a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81">分布式锁</a></li>
<li><a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%80%E8%87%B4%E6%80%A7%E7%AE%97%E6%B3%95">分布式一致性算法</a>
<ul>
<li><a href="#paxos">PAXOS</a></li>
<li><a href="#zab">Zab</a></li>
<li><a href="#raft">Raft</a></li>
<li><a href="#gossip">Gossip</a></li>
<li><a href="#%E4%B8%A4%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4-%E5%A4%9A%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4">两阶段提交、多阶段提交</a></li>
</ul>
</li>
<li><a href="#%E5%B9%82%E7%AD%89">幂等</a></li>
<li><a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%80%E8%87%B4%E6%96%B9%E6%A1%88">分布式一致方案</a></li>
<li><a href="#%E5%88%86%E5%B8%83%E5%BC%8F-leader-%E8%8A%82%E7%82%B9%E9%80%89%E4%B8%BE">分布式 Leader 节点选举</a></li>
<li><a href="#tcctryconfirmcancel-%E6%9F%94%E6%80%A7%E4%BA%8B%E5%8A%A1">TCC(Try/Confirm/Cancel) 柔性事务</a></li>
</ul>
</li>
<li><a href="#%E5%88%86%E5%B8%83%E5%BC%8F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F">分布式文件系统</a></li>
<li><a href="#%E5%94%AF%E4%B8%80id-%E7%94%9F%E6%88%90">唯一ID 生成</a>
<ul>
<li><a href="#%E5%85%A8%E5%B1%80%E5%94%AF%E4%B8%80id">全局唯一ID</a></li>
</ul>
</li>
<li><a href="#%E4%B8%80%E8%87%B4%E6%80%A7hash%E7%AE%97%E6%B3%95">一致性Hash算法</a></li>
</ul>
</li>
<li><a href="#%E8%AE%BE%E8%AE%A1%E6%80%9D%E6%83%B3-%E5%BC%80%E5%8F%91%E6%A8%A1%E5%BC%8F">设计思想 &amp; 开发模式</a>
<ul>
<li><a href="#ddddomain-driven-design-%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1">DDD(Domain-driven Design - 领域驱动设计)</a>
<ul>
<li><a href="#%E5%91%BD%E4%BB%A4%E6%9F%A5%E8%AF%A2%E8%81%8C%E8%B4%A3%E5%88%86%E7%A6%BBcqrs">命令查询职责分离(CQRS)</a></li>
<li><a href="#%E8%B4%AB%E8%A1%80%E5%85%85%E8%A1%80%E6%A8%A1%E5%9E%8B">贫血，充血模型</a></li>
</ul>
</li>
<li><a href="#actor-%E6%A8%A1%E5%BC%8F">Actor 模式</a></li>
<li><a href="#%E5%93%8D%E5%BA%94%E5%BC%8F%E7%BC%96%E7%A8%8B">响应式编程</a>
<ul>
<li><a href="#reactor">Reactor</a></li>
<li><a href="#rxjava">RxJava</a></li>
<li><a href="#vertx">Vert.x</a></li>
</ul>
</li>
<li><a href="#dodaf20">DODAF2.0</a></li>
<li><a href="#serverless">Serverless</a></li>
<li><a href="#service-mesh">Service Mesh</a></li>
</ul>
</li>
<li><a href="#%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86">项目管理</a>
<ul>
<li><a href="#%E6%9E%B6%E6%9E%84%E8%AF%84%E5%AE%A1">架构评审</a></li>
<li><a href="#%E9%87%8D%E6%9E%84">重构</a></li>
<li><a href="#%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83">代码规范</a></li>
<li><a href="#%E4%BB%A3%E7%A0%81-review">代码 Review</a></li>
<li><a href="#rup">RUP</a></li>
<li><a href="#%E7%9C%8B%E6%9D%BF%E7%AE%A1%E7%90%86">看板管理</a></li>
<li><a href="#scrum">SCRUM</a></li>
<li><a href="#%E6%95%8F%E6%8D%B7%E5%BC%80%E5%8F%91">敏捷开发</a></li>
<li><a href="#%E6%9E%81%E9%99%90%E7%BC%96%E7%A8%8Bxp">极限编程（XP）</a></li>
<li><a href="#%E7%BB%93%E5%AF%B9%E7%BC%96%E7%A8%8B">结对编程</a></li>
<li><a href="#pdca-%E5%BE%AA%E7%8E%AF%E8%B4%A8%E9%87%8F%E7%AE%A1%E7%90%86">PDCA 循环质量管理</a></li>
<li><a href="#fmea%E7%AE%A1%E7%90%86%E6%A8%A1%E5%BC%8F">FMEA管理模式</a></li>
</ul>
</li>
<li><a href="#%E9%80%9A%E7%94%A8%E4%B8%9A%E5%8A%A1%E6%9C%AF%E8%AF%AD">通用业务术语</a></li>
<li><a href="#%E6%8A%80%E6%9C%AF%E8%B6%8B%E5%8A%BF">技术趋势</a></li>
<li><a href="#%E6%94%BF%E7%AD%96-%E6%B3%95%E8%A7%84">政策、法规</a>
<ul>
<li><a href="#%E6%B3%95%E5%BE%8B">法律</a>
<ul>
<li><a href="#%E4%B8%A5%E6%A0%BC%E9%81%B5%E5%AE%88%E5%88%91%E6%B3%95253%E6%B3%95%E6%9D%A1">严格遵守刑法253法条</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#%E6%9E%B6%E6%9E%84%E5%B8%88%E7%B4%A0%E8%B4%A8">架构师素质</a></li>
<li><a href="#%E5%9B%A2%E9%98%9F%E7%AE%A1%E7%90%86">团队管理</a>
<ul>
<li><a href="#%E6%8B%9B%E8%81%98">招聘</a></li>
</ul>
</li>
<li><a href="#%E8%B5%84%E8%AE%AF">资讯</a>
<ul>
<li><a href="#%E8%A1%8C%E4%B8%9A%E8%B5%84%E8%AE%AF">行业资讯</a></li>
<li><a href="#%E5%85%AC%E4%BC%97%E5%8F%B7%E5%88%97%E8%A1%A8">公众号列表</a></li>
<li><a href="#%E5%8D%9A%E5%AE%A2">博客</a>
<ul>
<li><a href="#%E5%9B%A2%E9%98%9F%E5%8D%9A%E5%AE%A2">团队博客</a></li>
<li><a href="#%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2">个人博客</a></li>
</ul>
</li>
<li><a href="#%E7%BB%BC%E5%90%88%E9%97%A8%E6%88%B7-%E7%A4%BE%E5%8C%BA">综合门户、社区</a></li>
<li><a href="#%E9%97%AE%E7%AD%94-%E8%AE%A8%E8%AE%BA%E7%B1%BB%E7%A4%BE%E5%8C%BA">问答、讨论类社区</a></li>
<li><a href="#%E8%A1%8C%E4%B8%9A%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90">行业数据分析</a></li>
<li><a href="#%E4%B8%93%E9%A1%B9%E7%BD%91%E7%AB%99">专项网站</a></li>
<li><a href="#%E5%85%B6%E4%BB%96%E7%B1%BB">其他类</a></li>
<li><a href="#%E6%8E%A8%E8%8D%90%E5%8F%82%E8%80%83%E4%B9%A6">推荐参考书</a>
<ul>
<li><a href="#%E5%9C%A8%E7%BA%BF%E7%94%B5%E5%AD%90%E4%B9%A6">在线电子书</a></li>
<li><a href="#%E7%BA%B8%E8%B4%A8%E4%B9%A6">纸质书</a>
<ul>
<li><a href="#%E5%BC%80%E5%8F%91%E6%96%B9%E9%9D%A2">开发方面</a></li>
<li><a href="#%E6%9E%B6%E6%9E%84%E6%96%B9%E9%9D%A2">架构方面</a></li>
<li><a href="#%E6%8A%80%E6%9C%AF%E7%AE%A1%E7%90%86%E6%96%B9%E9%9D%A2">技术管理方面</a></li>
<li><a href="#%E5%9F%BA%E7%A1%80%E7%90%86%E8%AE%BA-2">基础理论</a></li>
<li><a href="#%E5%B7%A5%E5%85%B7%E6%96%B9%E9%9D%A2">工具方面</a></li>
<li><a href="#%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%96%B9%E9%9D%A2">大数据方面</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><a href="#%E6%8A%80%E6%9C%AF%E8%B5%84%E6%BA%90">技术资源</a>
<ul>
<li><a href="#%E5%BC%80%E6%BA%90%E8%B5%84%E6%BA%90">开源资源</a></li>
<li><a href="#%E6%89%8B%E5%86%8C-%E6%96%87%E6%A1%A3-%E6%95%99%E7%A8%8B">手册、文档、教程</a></li>
<li><a href="#%E5%9C%A8%E7%BA%BF%E8%AF%BE%E5%A0%82">在线课堂</a></li>
<li><a href="#%E4%BC%9A%E8%AE%AE-%E6%B4%BB%E5%8A%A8">会议、活动</a></li>
<li><a href="#%E5%B8%B8%E7%94%A8app">常用APP</a></li>
<li><a href="#%E6%89%BE%E5%B7%A5%E4%BD%9C">找工作</a></li>
<li><a href="#%E5%B7%A5%E5%85%B7">工具</a></li>
<li><a href="#%E4%BB%A3%E7%A0%81%E6%89%98%E7%AE%A1">代码托管</a></li>
<li><a href="#%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1">文件服务</a></li>
<li><a href="#%E7%BB%BC%E5%90%88%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%95%86">综合云服务商</a>
<ul>
<li><a href="#vps">VPS</a></li>
</ul>
</li>
</ul>
</li>
</ul>

  </div>
</div>

<script>

  let lastTop = 0, lList = [], hList = [], postBody, lastIndex = -1;
  let active = 'active-show', activeClass = 'active-current';
  let tocWrapper = document.querySelector('#toc_wrapper');
  let tocContent = tocWrapper.children[0];
  let autoNumber = tocWrapper && tocWrapper.classList.contains('auto-number');

  function addTocNumber(elem, deep) {
    if (!elem) {
      return;
    }
    let prop = elem.__proto__;

    if (prop === HTMLUListElement.prototype) {
      for (let i = 0; i < elem.children.length; i++) {
        addTocNumber(elem.children[i], deep + (i + 1) + '.');
      }
    } else if (prop === HTMLLIElement.prototype) {
      // 保存li元素
      if (elem.children[0] && elem.children[0].__proto__ === HTMLAnchorElement.prototype) {
        lList.push(elem);
      }
      for (let i = 0; i < elem.children.length; i++) {
        let cur = elem.children[i];
        if (cur.__proto__ === HTMLAnchorElement.prototype) {
          if (autoNumber) {
            cur.text = deep + ' ' + cur.text;
          }
        } else if (cur.__proto__ === HTMLUListElement.prototype) {
          addTocNumber(cur, deep);
        }
      }
    }
  }

  function removeParentActiveClass() {
    let parents = tocContent.querySelectorAll('.' + active)
    parents.forEach(function (elem) {
      elem.classList.remove(active);
    });
  }

  function addActiveClass(index) {
    if (index >= 0 && index < hList.length) {
      lList[index].classList.add(activeClass);
    }
  }

  function removeActiveClass(index) {
    if (index >= 0 && index < hList.length) {
      lList[index].classList.remove(activeClass);
    }
  }

  function addActiveLiElemment(elem, parent) {
    if (!elem || elem === parent) {
      return;
    } else {
      if (elem.__proto__ === HTMLLIElement.prototype) {
        elem.classList.add(active);
      }
      addActiveLiElemment(elem.parentElement, parent);
    }
  }

  function showToc() {
    if (tocWrapper) {
      postBody = document.querySelector('#post_body');
      for (let i = 0; i < postBody.children.length; i++) {
        if (postBody.children[i].__proto__ === HTMLHeadingElement.prototype) {
          hList.push(postBody.children[i]);
        }
      }
      if (tocWrapper.classList.contains('compress')) {
        tocContent.classList.add('closed');
      } else if (tocWrapper.classList.contains('no_compress')) {
        tocContent.classList.add('expanded');
      } else {
        if (hList.length > 10) {
          active = 'active-hidden'
          tocContent.classList.add('closed');
        } else {
          tocContent.classList.add('expanded');
        }
      }
    }
  }

  (function () {
    // 处理不是从#一级标题开始目录
    if (tocContent.children.length === 1 && tocContent.children[0].__proto__ === HTMLLIElement.prototype) {
      let con = tocContent.children[0].children[0];
      tocContent.innerHTML = con.innerHTML;
    }
    let markdownItTOC = document.querySelector('.markdownIt-TOC');
    let innerHeight = window.innerHeight;
    markdownItTOC.style = `max-height: ${innerHeight - 80 > 0 ? innerHeight - 80 : innerHeight}px`
    addTocNumber(tocContent, '');
  })();

  document.addEventListener('scroll', function (e) {
    if (lList.length <= 0) {
      return;
    }
    let scrollTop = document.scrollingElement.scrollTop + 10;
    let dir;

    if (lastTop - scrollTop > 0) {
      dir = 'up';
    } else {
      dir = 'down';
    }

    lastTop = scrollTop;
    if (scrollTop <= 0) {
      if (lastIndex >= 0 && lastIndex < hList.length) {
        lList[lastIndex].classList.remove(activeClass);
      }
      return;
    }

    let current = 0, hasFind = false;
    for (let i = 0; i < hList.length; i++) {
      if (hList[i].offsetTop > scrollTop) {
        current = i;
        hasFind = true;
        break;
      }
    }
    if (!hasFind && scrollTop > lList[lList.length - 1].offsetTop) {
      current = hList.length - 1;
    } else {
      current--;
    }
    if (dir === 'down') {
      if (current > lastIndex) {
        addActiveClass(current);
        removeActiveClass(lastIndex)
        lastIndex = current;
        removeParentActiveClass();
        lList[current] && addActiveLiElemment(lList[current].parentElement, tocContent);
      }
    } else {
      if (current < lastIndex) {
        addActiveClass(current);
        removeActiveClass(lastIndex);
        lastIndex = current;
        removeParentActiveClass();
        lList[current] && addActiveLiElemment(lList[current].parentElement, tocContent);
      }
    }
  });


  window.addEventListener('load', function () {
    showToc();
    document.querySelector('#sidebar').style = 'display: block;';
    tocWrapper.classList.add('toc-active');
    setTimeout(function () {
      if ("createEvent" in document) {
        let evt = document.createEvent("HTMLEvents");
        evt.initEvent("scroll", false, true);
        document.dispatchEvent(evt);
      }
      else {
        document.fireEvent("scroll");
      }
    }, 500)
  })

</script>
            </div>
          
        
      </div>
    </div>
  
</div>
<script>
  const SIDEBAR_TITLE_ACTIVE = 'sidebar-title-active';
  const SIDEBAR_BODY_ACTIVE = 'sidebar-body-active';
  const SLIDE_UP_IN = 'slide-up-in';

  let sidebar = document.querySelector('#sidebar'),
  tocSideBar = document.querySelector('#tocSideBar'),
  metaSideBar = document.querySelector('#metaSideBar'),
  postToc = document.querySelector('#post_toc'),
  postSiteMeta = document.querySelector('#post_side_meta'),
  sidebarTitle = document.querySelector('.sidebar-title'),
  sidebarBody = document.querySelector('#sidebar_body');

  tocSideBar && tocSideBar.addEventListener('click', (e) => {
    toggleSidebar(e);
  });

  metaSideBar && metaSideBar.addEventListener('click', (e) => {
    toggleSidebar(e);
  });

  function toggleSidebar(e) {
    let currentTitle = document.querySelector("."+SIDEBAR_TITLE_ACTIVE);
    if (currentTitle == e.srcElement) {
      return ;
    }
    let current, showElement, hideElement;
    if (e.srcElement == metaSideBar) {
      showElement = postSiteMeta;
      hideElement = postToc;
    } else if (e.srcElement == tocSideBar){
      showElement = postToc;
      hideElement = postSiteMeta;
    }
    currentTitle.classList.remove(SIDEBAR_TITLE_ACTIVE);
    e.srcElement.classList.add(SIDEBAR_TITLE_ACTIVE);

    window.Velocity(hideElement, 'stop');
    window.Velocity(hideElement, 'transition.slideUpOut', {
      display: 'none',
      duration: 200,
      complete: function () {
        window.Velocity(showElement, 'transition.slideDownIn', {
          duration: 200
        });
      }
    })
    hideElement.classList.remove(SIDEBAR_BODY_ACTIVE);
    showElement.classList.add(SIDEBAR_BODY_ACTIVE);
  }

  postToc && postToc.addEventListener('transitionend', function() {
    this.classList.remove(SLIDE_UP_IN);
  });

  if (sidebarBody) {
    if (sidebarBody.classList.contains('pisces') || sidebarBody.classList.contains('gemini')) {
      let hasFix = false;
      let scrollEl = document.querySelector('.main-continer');
      let limitTop = document.querySelector('#nav_ul').children.length * 42 + 162;
      window.addEventListener('scroll', function(e) {
        if (document.scrollingElement.scrollTop >= limitTop) {
          if (!hasFix) {
            sidebar.classList.add('sidebar-fixed');
            hasFix = true;
          }
        } else {
          if (hasFix) {
            sidebar.classList.remove('sidebar-fixed');
            hasFix = false;
          }
        }
      });
    }
  }
  
</script>
        <div class="section-box box-shadow-wrapper">
          <div class="section bg-color post post-page">
            <section class="post-header">
  <h1 class="post-title">
    <a class="post-title-link" href="/post/N2amIMO_J/">
      后端架构师技术图谱【转】
    </a>
  </h1>
  <div class="post-meta">
    
    <span class="meta-item pc-show">
      <i class="fa fa-calendar-o"></i>
      <span class="language" data-lan="publish">发布于</span>
      <span class="publish-time" data-t="2018-06-02 18:29:43">2018-06-02</span>
      <span class="post-meta-divider pc-show">|</span>
    </span>
    
    <span class="meta-item">
      <i class="fa fa-folder-o"></i>
      <span class="pc-show language" data-lan="category-in">分类于</span>
      
      
      <a href="/tag/wKIDH6M-M/">
        <span>PHP</span>
      </a>
      
      
    </span>
    <span class="post-meta-divider">|</span>
    
    <span class="meta-item">
      <i class="fa fa-clock-o"></i>
      <span>64<span class="language" data-lan="minute">分钟</span></span>
    </span>
    <span class="meta-item">
      <span class="post-meta-divider">|</span>
      <i class="fa fa-file-word-o"></i>
      <span>17709<span class="pc-show language" data-lan="words">字数</span></span>
    </span>
    
  </div>
</section>
            <div class="post-body next-md-body" id="post_body">
              <p><span style="color:red;"><strong>转自GitHub---<a href="https://github.com/xingshaocheng/architect-awesome">传送门</a>（如侵删）</strong></span></p>
<!-- more -->
<p>留意到的一个很好的后端技术图谱，害怕以后忘记，因此记录一下。</p>
<h1 id="数据结构">数据结构</h1>
<h2 id="队列">队列</h2>
<ul>
<li>
<p><a href="https://www.cnblogs.com/lemon-flm/p/7877898.html">《java队列——queue详细分析》</a></p>
<ul>
<li>非阻塞队列：ConcurrentLinkedQueue(无界线程安全)，采用CAS机制（compareAndSwapObject原子操作）。</li>
<li>阻塞队列：ArrayBlockingQueue(有界)、LinkedBlockingQueue（无界）、DelayQueue、PriorityBlockingQueue，采用锁机制；使用 ReentrantLock 锁。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/mantu/p/5802393.html">《LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue对比分析》</a></p>
</li>
</ul>
<h2 id="集合">集合</h2>
<ul>
<li><a href="https://blog.csdn.net/qq_33642117/article/details/52040345">《Java Set集合的详解》</a></li>
</ul>
<h2 id="链表-数组">链表、数组</h2>
<ul>
<li><a href="https://blog.csdn.net/wz249863091/article/details/52853360">《Java集合详解--什么是List》</a></li>
</ul>
<h2 id="字典-关联数组">字典、关联数组</h2>
<ul>
<li><a href="https://baike.xsoftlab.net/view/250.html">《Java map 详解 - 用法、遍历、排序、常用API等》</a></li>
</ul>
<h2 id="栈">栈</h2>
<ul>
<li><a href="https://blog.csdn.net/javazejian/article/details/53362993">《java数据结构与算法之栈（Stack）设计与实现》</a></li>
<li><a href="http://www.runoob.com/java/java-stack-class.html">《Java Stack 类》</a></li>
<li><a href="https://blog.csdn.net/f2006116/article/details/51375225">《java stack的详细实现分析》</a>
<ul>
<li>Stack 是线程安全的。</li>
<li>内部使用数组保存数据，不够时翻倍。</li>
</ul>
</li>
</ul>
<h2 id="树">树</h2>
<h3 id="二叉树">二叉树</h3>
<p>每个节点最多有两个叶子节点。</p>
<ul>
<li><a href="https://blog.csdn.net/cai2016/article/details/52589952">《二叉树》</a></li>
</ul>
<h3 id="完全二叉树">完全二叉树</h3>
<ul>
<li><a href="https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91/7773232?fr=aladdin">《完全二叉树》</a>
<ul>
<li>叶节点只能出现在最下层和次下层，并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。</li>
</ul>
</li>
</ul>
<h3 id="平衡二叉树">平衡二叉树</h3>
<p>左右两个子树的高度差的绝对值不超过1，并且左右两个子树都是一棵平衡二叉树。</p>
<ul>
<li><a href="http://www.cnblogs.com/polly333/p/4798944.html">《浅谈数据结构-平衡二叉树》</a></li>
<li><a href="http://www.cnblogs.com/yangecnu/p/Introduce-2-3-Search-Tree.html">《浅谈算法和数据结构: 八 平衡查找树之2-3树》</a></li>
</ul>
<h3 id="二叉查找树bst">二叉查找树（BST）</h3>
<p>二叉查找树（Binary Search Tree），也称有序二叉树（ordered binary tree）,排序二叉树（sorted binary tree）。</p>
<ul>
<li><a href="http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html">《浅谈算法和数据结构: 七 二叉查找树》</a></li>
</ul>
<h3 id="红黑树">红黑树</h3>
<ul>
<li><a href="https://blog.csdn.net/sun_tttt/article/details/65445754">《最容易懂得红黑树》</a>
<ul>
<li>添加阶段后，左旋或者右旋从而再次达到平衡。</li>
</ul>
</li>
<li><a href="http://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html">《浅谈算法和数据结构: 九 平衡查找树之红黑树》</a></li>
</ul>
<h3 id="b-bb树">B-，B+，B*树</h3>
<p>MySQL是基于B+树聚集索引组织表</p>
<ul>
<li><a href="https://blog.csdn.net/aqzwss/article/details/53074186">《B-树，B+树，B*树详解》</a></li>
<li><a href="https://blog.csdn.net/bigtree_3721/article/details/73632405">《B-树，B+树与B*树的优缺点比较》</a>
<ul>
<li>B+ 树的叶子节点链表结构相比于 B- 树便于扫库，和范围检索。</li>
</ul>
</li>
</ul>
<h3 id="lsm-树">LSM 树</h3>
<p>LSM（Log-Structured Merge-Trees）和 B+ 树相比，是牺牲了部分读的性能来换取写的性能(通过批量写入)，实现读写之间的。<br>
Hbase、LevelDB、Tair（Long DB）、nessDB 采用 LSM 树的结构。LSM可以快速建立索引。</p>
<ul>
<li>
<p><a href="https://blog.csdn.net/dbanote/article/details/8897599">《LSM树 VS B+树》</a></p>
<ul>
<li>B+ 树读性能好，但由于需要有序结构，当key比较分散时，磁盘寻道频繁，造成写性能。</li>
<li>LSM 是将一个大树拆分成N棵小树，先写到内存（无寻道问题，性能高），在内存中构建一颗有序小树（有序树），随着小树越来越大，内存的小树会flush到磁盘上。当读时，由于不知道数据在哪棵小树上，因此必须遍历（二分查找）所有的小树，但在每颗小树内部数据是有序的。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/u014774781/article/details/52105708">《LSM树（Log-Structured Merge Tree）存储引擎》</a></p>
<ul>
<li>极端的说，基于LSM树实现的HBase的写性能比MySQL高了一个数量级，读性能低了一个数量级。</li>
<li>优化方式：Bloom filter 替代二分查找；compact 小数位大树，提高查询性能。</li>
<li>Hbase 中，内存中达到一定阈值后，整体flush到磁盘上、形成一个文件（B+数），HDFS不支持update操作，所以Hbase做整体flush而不是merge update。flush到磁盘上的小树，定期会合并成一个大树。</li>
</ul>
</li>
</ul>
<h2 id="bitset">BitSet</h2>
<p>经常用于大规模数据的排重检查。</p>
<ul>
<li><a href="http://www.runoob.com/java/java-bitset-class.html">《Java Bitset类》</a></li>
<li><a href="https://blog.csdn.net/caiandyong/article/details/51581160">《Java BitSet（位集）》</a></li>
</ul>
<h1 id="常用算法">常用算法</h1>
<ul>
<li><a href="https://blog.csdn.net/gane_cheng/article/details/52652705">《常见排序算法及对应的时间复杂度和空间复杂度》</a></li>
</ul>
<h2 id="排序-查找算法">排序、查找算法</h2>
<ul>
<li><a href="https://blog.csdn.net/gane_cheng/article/details/52652705">《常见排序算法及对应的时间复杂度和空间复杂度》</a></li>
</ul>
<h3 id="选择排序">选择排序</h3>
<ul>
<li><a href="https://www.cnblogs.com/shen-hua/p/5424059.html">《Java中的经典算法之选择排序（SelectionSort）》</a>
<ul>
<li>每一趟从待排序的记录中选出最小的元素，顺序放在已排好序的序列最后，直到全部记录排序完毕。</li>
</ul>
</li>
</ul>
<h3 id="冒泡排序">冒泡排序</h3>
<ul>
<li><a href="https://blog.csdn.net/shuaizai88/article/details/73250615">《冒泡排序的2种写法》</a>
<ul>
<li>相邻元素前后交换、把最大的排到最后。</li>
<li>时间复杂度 O(n²)</li>
</ul>
</li>
</ul>
<h3 id="插入排序">插入排序</h3>
<ul>
<li><a href="https://www.cnblogs.com/hapjin/p/5517667.html">《排序算法总结之插入排序》</a></li>
</ul>
<h3 id="快速排序">快速排序</h3>
<ul>
<li><a href="http://developer.51cto.com/art/201403/430986.htm">《坐在马桶上看算法：快速排序》</a>
<ul>
<li>一侧比另外一次都大或小。</li>
</ul>
</li>
</ul>
<h3 id="归并排序">归并排序</h3>
<ul>
<li><a href="http://www.cnblogs.com/chengxiao/p/6194356.html">《图解排序算法(四)之归并排序》</a>
<ul>
<li>分而治之，分成小份排序，在合并(重建一个新空间进行复制)。</li>
</ul>
</li>
</ul>
<h3 id="希尔排序">希尔排序</h3>
<p>TODO</p>
<h3 id="堆排序">堆排序</h3>
<ul>
<li><a href="https://www.cnblogs.com/chengxiao/p/6129630.html">《图解排序算法(三)之堆排序》</a>
<ul>
<li>排序过程就是构建最大堆的过程，最大堆：每个结点的值都大于或等于其左右孩子结点的值，堆顶元素是最大值。</li>
</ul>
</li>
</ul>
<h3 id="计数排序">计数排序</h3>
<ul>
<li><a href="https://www.cnblogs.com/suvllian/p/5495780.html">《计数排序和桶排序》</a>
<ul>
<li>和桶排序过程比较像，差别在于桶的数量。</li>
</ul>
</li>
</ul>
<h3 id="桶排序">桶排序</h3>
<ul>
<li><a href="http://blog.51cto.com/ahalei/1362789">《【啊哈！算法】最快最简单的排序——桶排序》</a></li>
<li><a href="https://blog.csdn.net/sunjinshengli/article/details/70738527">《排序算法（三）：计数排序与桶排序》</a>
<ul>
<li>桶排序将[0,1)区间划分为n个相同的大小的子区间，这些子区间被称为桶。</li>
<li>每个桶单独进行排序，然后再遍历每个桶。</li>
</ul>
</li>
</ul>
<h3 id="基数排序">基数排序</h3>
<p>按照个位、十位、百位、...依次来排。</p>
<ul>
<li><a href="https://blog.csdn.net/lemon_tree12138/article/details/51695211">《排序算法系列：基数排序》</a></li>
<li><a href="https://www.cnblogs.com/skywang12345/p/3603669.html">《基数排序》</a></li>
</ul>
<h3 id="二分查找">二分查找</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/coderising/p/5708632.html">《二分查找(java实现)》</a></p>
<ul>
<li>要求待查找的序列有序。</li>
<li>时间复杂度 O(logN)。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/maoyuanming0806/article/details/78176957">《java实现二分查找-两种方式》</a></p>
<ul>
<li>while + 递归。</li>
</ul>
</li>
</ul>
<h3 id="java-中的排序工具">Java 中的排序工具</h3>
<ul>
<li><a href="https://blog.csdn.net/u011410529/article/details/56668545?locationnum=6&amp;fps=1">《Arrays.sort和Collections.sort实现原理解析》</a>
<ul>
<li>Collections.sort算法调用的是合并排序。</li>
<li>Arrays.sort() 采用了2种排序算法 -- 基本类型数据使用快速排序法，对象数组使用归并排序。</li>
</ul>
</li>
</ul>
<h2 id="布隆过滤器">布隆过滤器</h2>
<p>常用于大数据的排重，比如email，url 等。<br>
核心原理：将每条数据通过计算产生一个指纹（一个字节或多个字节，但一定比原始数据要少很多），其中每一位都是通过随机计算获得，在将指纹映射到一个大的按位存储的空间中。注意：会有一定的错误率。<br>
优点：空间和时间效率都很高。<br>
缺点：随着存入的元素数量增加，误算率随之增加。</p>
<ul>
<li><a href="https://segmentfault.com/a/1190000002729689">《布隆过滤器 -- 空间效率很高的数据结构》</a></li>
<li><a href="https://blog.csdn.net/zdxiq000/article/details/57626464">《大量数据去重：Bitmap和布隆过滤器(Bloom Filter)》</a></li>
<li><a href="https://blog.csdn.net/qq_30242609/article/details/71024458">《基于Redis的布隆过滤器的实现》</a>
<ul>
<li>基于 Redis 的 Bitmap 数据结构。</li>
</ul>
</li>
<li><a href="https://blog.csdn.net/lemon_tree12138/article/details/47973715">《网络爬虫：URL去重策略之布隆过滤器(BloomFilter)的使用》</a>
<ul>
<li>使用Java中的 BitSet 类 和 加权和hash算法。</li>
</ul>
</li>
</ul>
<h2 id="字符串比较">字符串比较</h2>
<h3 id="kmp-算法">KMP 算法</h3>
<p>KMP：Knuth-Morris-Pratt算法（简称KMP）<br>
核心原理是利用一个“部分匹配表”，跳过已经匹配过的元素。</p>
<ul>
<li><a href="http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html">《字符串匹配的KMP算法》</a></li>
</ul>
<h2 id="深度优先-广度优先">深度优先、广度优先</h2>
<ul>
<li><a href="https://www.cnblogs.com/0kk470/p/7555033.html">《广度优先搜索BFS和深度优先搜索DFS》</a></li>
</ul>
<h2 id="贪心算法">贪心算法</h2>
<ul>
<li><a href="https://www.cnblogs.com/MrSaver/p/8641971.html">《算法：贪婪算法基础》</a></li>
<li><a href="https://blog.csdn.net/a345017062/article/details/52443781">《常见算法及问题场景——贪心算法》</a></li>
</ul>
<h2 id="回溯算法">回溯算法</h2>
<ul>
<li><a href="https://blog.csdn.net/qfikh/article/details/51960331">《 五大常用算法之四：回溯法》</a></li>
</ul>
<h2 id="剪枝算法">剪枝算法</h2>
<ul>
<li><a href="https://blog.csdn.net/luningcsdn/article/details/50930276">《α-β剪枝算法》</a></li>
</ul>
<h2 id="动态规划">动态规划</h2>
<ul>
<li><a href="https://www.cnblogs.com/little-YTMM/p/5372680.html">《详解动态规划——邹博讲动态规划》</a></li>
<li><a href="https://blog.csdn.net/yao_zi_jie/article/details/54580283">《动态规划算法的个人理解》</a></li>
</ul>
<h2 id="朴素贝叶斯">朴素贝叶斯</h2>
<ul>
<li>
<p><a href="https://blog.csdn.net/amds123/article/details/70173402">《带你搞懂朴素贝叶斯分类算法》</a></p>
<ul>
<li>P(B|A)=P(A|B)P(B)/P(A)</li>
</ul>
</li>
<li>
<p><a href="http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.html">《贝叶斯推断及其互联网应用1》</a></p>
</li>
<li>
<p><a href="http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_two.html">《贝叶斯推断及其互联网应用2》</a></p>
</li>
</ul>
<h2 id="推荐算法">推荐算法</h2>
<ul>
<li><a href="http://www.infoq.com/cn/articles/recommendation-algorithm-overview-part01">《推荐算法综述》</a></li>
<li><a href="https://www.oschina.net/news/51297/top-10-open-source-recommendation-systems">《TOP 10 开源的推荐系统简介》</a></li>
</ul>
<h2 id="最小生成树算法">最小生成树算法</h2>
<ul>
<li><a href="https://blog.csdn.net/luoshixian099/article/details/51908175">《算法导论--最小生成树（Kruskal和Prim算法）》</a></li>
</ul>
<h2 id="最短路径算法">最短路径算法</h2>
<ul>
<li><a href="https://blog.csdn.net/qq_35644234/article/details/60870719">《Dijkstra算法详解》</a></li>
</ul>
<h1 id="并发">并发</h1>
<h2 id="java-并发">Java 并发</h2>
<ul>
<li><a href="https://github.com/CL0610/Java-concurrency">Java 并发知识合集</a></li>
<li><a href="https://github.com/CL0610/Java-concurrency/blob/master/Java%E5%B9%B6%E5%8F%91%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1.png">JAVA并发知识图谱</a></li>
</ul>
<h2 id="多线程">多线程</h2>
<ul>
<li><a href="http://www.importnew.com/18459.html">《40个Java多线程问题总结》</a></li>
</ul>
<h2 id="线程安全">线程安全</h2>
<ul>
<li><a href="https://www.cnblogs.com/zhanht/p/5450325.html">《Java并发编程——线程安全及解决机制简介》</a></li>
</ul>
<h2 id="一致性-事务">一致性、事务</h2>
<h3 id="事务-acid-特性">事务 ACID 特性</h3>
<ul>
<li><a href="https://blog.csdn.net/u012440687/article/details/52116108">《数据库事务ACID特性》</a></li>
</ul>
<h3 id="事务的隔离级别">事务的隔离级别</h3>
<ul>
<li>
<p>未提交读：一个事务可以读取另一个未提交的数据，容易出现脏读的情况。</p>
</li>
<li>
<p>读提交：一个事务等另外一个事务提交之后才可以读取数据，但会出现不可重复读的情况（多次读取的数据不一致），读取过程中出现UPDATE操作，会多。（大多数数据库默认级别是RC，比如SQL Server，Oracle），读取的时候不可以修改。</p>
</li>
<li>
<p>可重复读： 同一个事务里确保每次读取的时候，获得的是同样的数据，但不保障原始数据被其他事务更新（幻读），Mysql InnoDB 就是这个级别。</p>
</li>
<li>
<p>序列化：所有事物串行处理（牺牲了效率）</p>
</li>
<li>
<p><a href="https://blog.csdn.net/qq_33290787/article/details/51924963">《理解事务的4种隔离级别》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/z-sm/p/7245981.html">数据库事务的四大特性及事务隔离级别</a></p>
</li>
<li>
<p><a href="http://blog.sina.com.cn/s/blog_499740cb0100ugs7.html">《MySQL的InnoDB的幻读问题 》</a></p>
<ul>
<li>幻读的例子非常清楚。</li>
<li>通过 SELECT ... FOR UPDATE 解决。</li>
</ul>
</li>
<li>
<p><a href="http://database.51cto.com/art/201804/570101.htm">《一篇文章带你读懂MySQL和InnoDB》</a></p>
<ul>
<li>图解脏读、不可重复读、幻读问题。</li>
</ul>
</li>
</ul>
<h3 id="mvcc">MVCC</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/chenpingzhao/p/5065316.html">《【mysql】关于innodb中MVCC的一些理解》</a></p>
<ul>
<li>innodb 中 MVCC 用在 Repeatable-Read 隔离级别。</li>
<li>MVCC 会产生幻读问题（更新时异常。）</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/whoamiyang/article/details/51901888">《轻松理解MYSQL MVCC 实现机制》</a></p>
<ul>
<li>通过隐藏版本列来实现 MVCC 控制，一列记录创建时间、一列记录删除时间，这里的时间</li>
<li>每次只操作比当前版本小（或等于）的 行。</li>
</ul>
</li>
</ul>
<h2 id="锁">锁</h2>
<h3 id="java中的锁和同步类">Java中的锁和同步类</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/qifengshi/p/6831055.html">《Java中的锁分类》</a></p>
<ul>
<li>主要包括 synchronized、ReentrantLock、和 ReadWriteLock。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/waterystone/p/4920797.html">《Java并发之AQS详解》</a></p>
</li>
<li>
<p><a href="http://cuisuqiang.iteye.com/blog/2020146">《Java中信号量 Semaphore》</a></p>
<ul>
<li>有数量控制</li>
<li>申请用 acquire，申请不要则阻塞；释放用 release。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/davidwang456/p/6094947.html">《java开发中的Mutex vs Semaphore》</a></p>
<ul>
<li>简单的说 就是Mutex是排它的，只有一个可以获取到资源， Semaphore也具有排它性，但可以定义多个可以获取的资源的对象。</li>
</ul>
</li>
</ul>
<h3 id="公平锁-非公平锁">公平锁 &amp; 非公平锁</h3>
<p>公平锁的作用就是严格按照线程启动的顺序来执行的，不允许其他线程插队执行的；而非公平锁是允许插队的。</p>
<ul>
<li><a href="https://blog.csdn.net/EthanWhite/article/details/55508357">《公平锁与非公平锁》</a>
<ul>
<li>默认情况下 ReentrantLock 和 synchronized 都是非公平锁。ReentrantLock 可以设置成公平锁。</li>
</ul>
</li>
</ul>
<h3 id="悲观锁">悲观锁</h3>
<p>悲观锁如果使用不当（锁的条数过多），会引起服务大面积等待。推荐优先使用乐观锁+重试。</p>
<ul>
<li>
<p><a href="https://www.cnblogs.com/zhiqian-ali/p/6200874.html">《【MySQL】悲观锁&amp;乐观锁》</a></p>
<ul>
<li>乐观锁的方式：版本号+重试方式</li>
<li>悲观锁：通过 select ... for update 进行行锁(不可读、不可写，share 锁可读不可写)。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/Lawson/p/5008741.html">《Mysql查询语句使用select.. for update导致的数据库死锁分析》</a></p>
<ul>
<li>mysql的innodb存储引擎实务锁虽然是锁行，但它内部是锁索引的。</li>
<li>锁相同数据的不同索引条件可能会引起死锁。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/zejin2008/p/5262751.html">《Mysql并发时经典常见的死锁原因及解决方法》</a></p>
</li>
</ul>
<h3 id="乐观锁-cas">乐观锁 &amp; CAS</h3>
<ul>
<li><a href="http://www.importnew.com/20472.html">《乐观锁的一种实现方式——CAS》</a>
<ul>
<li>和MySQL乐观锁方式相似，只不过是通过和原值进行比较。</li>
</ul>
</li>
</ul>
<h3 id="aba-问题">ABA 问题</h3>
<p>由于高并发，在CAS下，更新后可能此A非彼A。通过版本号可以解决，类似于上文Mysql 中提到的的乐观锁。</p>
<ul>
<li><a href="https://www.cnblogs.com/549294286/p/3766717.html">《Java CAS 和ABA问题》</a></li>
<li><a href="https://blog.csdn.net/li954644351/article/details/50511879">《Java 中 ABA问题及避免》</a>
<ul>
<li>AtomicStampedReference 和 AtomicStampedReference。</li>
</ul>
</li>
</ul>
<h3 id="copyonwrite容器">CopyOnWrite容器</h3>
<p>可以对CopyOnWrite容器进行并发的读，而不需要加锁。CopyOnWrite并发容器用于读多写少的并发场景。比如白名单，黑名单，商品类目的访问和更新场景，不适合需要数据强一致性的场景。</p>
<ul>
<li>
<p><a href="https://www.cnblogs.com/hapjin/p/4840107.html">《JAVA中写时复制(Copy-On-Write)Map实现》</a></p>
<ul>
<li>实现读写分离，读取发生在原始数据上，写入发生在副本上。</li>
<li>不用加锁，通过最终一致实现一致性。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/a494303877/article/details/53404623">《聊聊并发-Java中的Copy-On-Write容器》</a></p>
</li>
</ul>
<h3 id="ringbuffer">RingBuffer</h3>
<ul>
<li><a href="http://www.cnblogs.com/l00l/p/4115001.html">《线程安全的无锁RingBuffer的实现【一个读线程，一个写线程】》</a></li>
</ul>
<h3 id="可重入锁-不可重入锁">可重入锁 &amp; 不可重入锁</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/dj3839/p/6580765.html">《可重入锁和不可重入锁》</a></p>
<ul>
<li>通过简单代码举例说明可重入锁和不可重入锁。</li>
<li>可重入锁指同一个线程可以再次获得之前已经获得的锁。</li>
<li>可重入锁可以用户避免死锁。</li>
<li>Java中的可重入锁：synchronized 和 java.util.concurrent.locks.ReentrantLock</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/baizhanshi/p/7211802.html">《ReenTrantLock可重入锁（和synchronized的区别）总结》</a></p>
<ul>
<li>synchronized 使用方便，编译器来加锁，是非公平锁。</li>
<li>ReenTrantLock 使用灵活，锁的公平性可以定制。</li>
<li>相同加锁场景下，推荐使用 synchronized。</li>
</ul>
</li>
</ul>
<h3 id="互斥锁-共享锁">互斥锁 &amp; 共享锁</h3>
<p>互斥锁：同时只能有一个线程获得锁。比如，ReentrantLock 是互斥锁，ReadWriteLock 中的写锁是互斥锁。<br>
共享锁：可以有多个线程同时或的锁。比如，Semaphore、CountDownLatch 是共享锁，ReadWriteLock 中的读锁是共享锁。</p>
<ul>
<li><a href="https://www.cnblogs.com/liang1101/p/6475555.html">《ReadWriteLock场景应用》</a></li>
</ul>
<h3 id="死锁">死锁</h3>
<ul>
<li>
<p><a href="https://blog.csdn.net/yunfenglw/article/details/45950305">《“死锁”四个必要条件的合理解释》</a></p>
<ul>
<li>互斥、持有、不可剥夺、环形等待。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/u014039577/article/details/52351626">Java如何查看死锁？</a></p>
<ul>
<li>JConsole 可以识别死锁。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/bohu83/article/details/51135061">java多线程系列：死锁及检测</a></p>
<ul>
<li>jstack 可以显示死锁。</li>
</ul>
</li>
</ul>
<h1 id="操作系统">操作系统</h1>
<h2 id="计算机原理">计算机原理</h2>
<ul>
<li><a href="https://segmentfault.com/a/1190000003692840">《操作系统基础知识——操作系统的原理，类型和结构》</a></li>
</ul>
<h2 id="cpu">CPU</h2>
<h3 id="多级缓存">多级缓存</h3>
<p>典型的 CPU 有三级缓存，距离核心越近，速度越快，空间越小。L1 一般 32k，L2 一般 256k，L3 一般12M。内存速度需要200个 CPU 周期，CPU 缓存需要1个CPU周期。</p>
<ul>
<li><a href="https://blog.csdn.net/zero__007/article/details/54089730">《从Java视角理解CPU缓存和伪共享》</a></li>
</ul>
<h2 id="进程">进程</h2>
<p>TODO</p>
<h2 id="线程">线程</h2>
<ul>
<li><a href="https://blog.csdn.net/asdf_1024/article/details/78978437">《线程的生命周期及状态转换详解》</a></li>
</ul>
<h2 id="协程">协程</h2>
<ul>
<li><a href="https://www.thinksaas.cn/group/topic/839375/">《终结python协程----从yield到actor模型的实现》</a>
<ul>
<li>线程的调度是由操作系统负责，协程调度是程序自行负责</li>
<li>与线程相比，协程减少了无谓的操作系统切换.</li>
<li>实际上当遇到IO操作时做切换才更有意义，（因为IO操作不用占用CPU），如果没遇到IO操作，按照时间片切换.</li>
</ul>
</li>
</ul>
<h2 id="linux">Linux</h2>
<ul>
<li><a href="http://www.runoob.com/linux/linux-command-manual.html">《Linux 命令大全》</a></li>
</ul>
<h1 id="设计模式">设计模式</h1>
<h2 id="设计模式的六大原则">设计模式的六大原则</h2>
<ul>
<li><a href="https://blog.csdn.net/q291611265/article/details/48465113">《设计模式的六大原则》</a>
<ul>
<li>开闭原则：对扩展开放,对修改关闭，多使用抽象类和接口。</li>
<li>里氏替换原则：基类可以被子类替换，使用抽象类继承,不使用具体类继承。</li>
<li>依赖倒转原则：要依赖于抽象,不要依赖于具体，针对接口编程,不针对实现编程。</li>
<li>接口隔离原则：使用多个隔离的接口,比使用单个接口好，建立最小的接口。</li>
<li>迪米特法则：一个软件实体应当尽可能少地与其他实体发生相互作用，通过中间类建立联系。</li>
<li>合成复用原则：尽量使用合成/聚合,而不是使用继承。</li>
</ul>
</li>
</ul>
<h2 id="23种常见设计模式">23种常见设计模式</h2>
<ul>
<li><a href="http://www.runoob.com/design-pattern/design-pattern-tutorial.html">《设计模式》</a></li>
<li><a href="https://www.cnblogs.com/susanws/p/5510229.html">《23种设计模式全解析》</a></li>
</ul>
<h2 id="应用场景">应用场景</h2>
<ul>
<li>
<p><a href="http://blog.jobbole.com/62314/">《细数JDK里的设计模式》</a></p>
<ul>
<li>
<p>结构型模式：</p>
<ul>
<li>适配器：用来把一个接口转化成另一个接口，如 java.util.Arrays#asList()。</li>
<li>桥接模式：这个模式将抽象和抽象操作的实现进行了解耦，这样使得抽象和实现可以独立地变化，如JDBC；</li>
<li>组合模式：使得客户端看来单个对象和对象的组合是同等的。换句话说，某个类型的方法同时也接受自身类型作为参数，如 Map.putAll，List.addAll、Set.addAll。</li>
<li>装饰者模式：动态的给一个对象附加额外的功能，这也是子类的一种替代方式，如 java.util.Collections#checkedList|Map|Set|SortedSet|SortedMap。</li>
<li>享元模式：使用缓存来加速大量小对象的访问时间，如 valueOf(int)。</li>
<li>代理模式：代理模式是用一个简单的对象来代替一个复杂的或者创建耗时的对象，如 java.lang.reflect.Proxy</li>
</ul>
</li>
<li>
<p>创建模式:</p>
<ul>
<li>抽象工厂模式：抽象工厂模式提供了一个协议来生成一系列的相关或者独立的对象，而不用指定具体对象的类型，如 java.util.Calendar#getInstance()。</li>
<li>建造模式(Builder)：定义了一个新的类来构建另一个类的实例，以简化复杂对象的创建，如：java.lang.StringBuilder#append()。</li>
<li>工厂方法：就是 <strong>一个返</strong>* 回具体对象的方法，而不是多个，如 java.lang.Object#toString()、java.lang.Class#newInstance()。</li>
<li>原型模式：使得类的实例能够生成自身的拷贝、如：java.lang.Object#clone()。</li>
<li>单例模式：全局只有一个实例，如 java.lang.Runtime#getRuntime()。</li>
</ul>
</li>
<li>
<p>行为模式：</p>
<ul>
<li>责任链模式：通过把请求从一个对象传递到链条中下一个对象的方式，直到请求被处理完毕，以实现对象间的解耦。如 javax.servlet.Filter#doFilter()。</li>
<li>命令模式：将操作封装到对象内，以便存储，传递和返回，如：java.lang.Runnable。</li>
<li>解释器模式：定义了一个语言的语法，然后解析相应语法的语句，如，java.text.Format，java.text.Normalizer。</li>
<li>迭代器模式：提供一个一致的方法来顺序访问集合中的对象，如 java.util.Iterator。</li>
<li>中介者模式：通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖，java.lang.reflect.Method#invoke()。</li>
<li>空对象模式：如 java.util.Collections#emptyList()。</li>
<li>观察者模式：它使得一个对象可以灵活的将消息发送给感兴趣的对象，如 java.util.EventListener。</li>
<li>模板方法模式：让子类可以重写方法的一部分，而不是整个重写，如 java.util.Collections#sort()。</li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/hwaggLee/p/4510687.html">《Spring-涉及到的设计模式汇总》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/u012387062/article/details/54719114">《Mybatis使用的设计模式》</a></p>
</li>
</ul>
<h2 id="单例模式">单例模式</h2>
<ul>
<li><a href="https://blog.csdn.net/YECrazy/article/details/79481964">《单例模式的三种实现 以及各自的优缺点》</a></li>
<li><a href="https://www.cnblogs.com/ttylinux/p/6498822.html">《单例模式－－反射－－防止序列化破坏单例模式》</a>
<ul>
<li>使用枚举类型。</li>
</ul>
</li>
</ul>
<h2 id="责任链模式">责任链模式</h2>
<p>TODO</p>
<h2 id="mvc">MVC</h2>
<ul>
<li><a href="http://www.runoob.com/design-pattern/mvc-pattern.html">《MVC 模式》</a>
<ul>
<li>模型(model)－视图(view)－控制器(controller)</li>
</ul>
</li>
</ul>
<h2 id="ioc">IOC</h2>
<ul>
<li><a href="https://www.zhihu.com/question/23277575">《理解 IOC》</a></li>
<li><a href="https://www.cnblogs.com/NancyStartOnce/p/6813162.html">《IOC 的理解与解释》</a>
<ul>
<li>正向控制：传统通过new的方式。反向控制，通过容器注入对象。</li>
<li>作用：用于模块解耦。</li>
<li>DI：Dependency Injection，即依赖注入，只关心资源使用，不关心资源来源。</li>
</ul>
</li>
</ul>
<h2 id="aop">AOP</h2>
<ul>
<li><a href="https://my.oschina.net/yanquan345/blog/203415">《轻松理解AOP(面向切面编程)》</a></li>
<li><a href="https://www.cnblogs.com/hongwz/p/5764917.html">《Spring AOP详解》</a></li>
<li><a href="http://www.importnew.com/24305.html">《Spring AOP的实现原理》</a>
<ul>
<li>Spring AOP使用的动态代理，主要有两种方式：JDK动态代理和CGLIB动态代理。</li>
</ul>
</li>
<li><a href="https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/">《Spring AOP 实现原理与 CGLIB 应用》</a>
<ul>
<li>Spring AOP 框架对 AOP 代理类的处理原则是：如果目标对象的实现类实现了接口，Spring AOP 将会采用 JDK 动态代理来生成 AOP 代理类；如果目标对象的实现类没有实现接口，Spring AOP 将会采用 CGLIB 来生成 AOP 代理类</li>
</ul>
</li>
</ul>
<h2 id="uml">UML</h2>
<ul>
<li><a href="https://www.w3cschool.cn/uml_tutorial/">《UML教程》</a></li>
</ul>
<h2 id="微服务思想">微服务思想</h2>
<ul>
<li><a href="https://www.cnblogs.com/wintersun/p/6219259.html">《微服务架构设计》</a></li>
<li><a href="http://www.infoq.com/cn/articles/micro-service-technology-stack">《微服务架构技术栈选型手册》</a></li>
</ul>
<h3 id="康威定律">康威定律</h3>
<ul>
<li>
<p><a href="https://yq.aliyun.com/articles/8611">《微服务架构的理论基础 - 康威定律》</a></p>
<ul>
<li>定律一：组织沟通方式会通过系统设计表达出来，就是说架构的布局和组织结构会有相似。</li>
<li>定律二：时间再多一件事情也不可能做的完美，但总有时间做完一件事情。一口气吃不成胖子，先搞定能搞定的。</li>
<li>定律三：线型系统和线型组织架构间有潜在的异质同态特性。种瓜得瓜，做独立自治的子系统减少沟通成本。</li>
<li>定律四：大的系统组织总是比小系统更倾向于分解。合久必分，分而治之。</li>
</ul>
</li>
<li>
<p><a href="https://static.geekbang.org/PDF-%E4%BF%AE%E6%94%B9%E7%89%88-%E6%9E%81%E5%AE%A2%E6%97%B6%E9%97%B4-%E5%9B%BE%E7%89%87-%E6%9D%A8%E6%B3%A2-%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84.pdf">《微服务架构核⼼20讲》</a></p>
</li>
</ul>
<h1 id="运维-统计-技术支持">运维 &amp; 统计 &amp; 技术支持</h1>
<h2 id="常规监控">常规监控</h2>
<ul>
<li>
<p><a href="https://blog.csdn.net/enweitech/article/details/77849205">《腾讯业务系统监控的修炼之路》</a></p>
<ul>
<li>监控的方式：主动、被动、旁路(比如舆情监控)</li>
<li>监控类型： 基础监控、服务端监控、客户端监控、<br>
监控、用户端监控</li>
<li>监控的目标：全、块、准</li>
<li>核心指标：请求量、成功率、耗时</li>
</ul>
</li>
<li>
<p><a href="https://www.oschina.net/news/67525/monitoring-tools">《开源还是商用？十大云运维监控工具横评》</a></p>
<ul>
<li>Zabbix、Nagios、Ganglia、Zenoss、Open-falcon、监控宝、 360网站服务监控、阿里云监控、百度云观测、小蜜蜂网站监测等。</li>
</ul>
</li>
<li>
<p><a href="http://developer.51cto.com/art/201612/525373.htm">《监控报警系统搭建及二次开发经验》</a></p>
</li>
</ul>
<p><strong>命令行监控工具</strong></p>
<ul>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-er-pian-ff1a-feng-kuang-yuan-shi-ren/44-an-quan-yu-yun-wei/445-fu-wu-qi-zhuang-tai-jian-ce/4451-ming-ling-xing-gong-ju.html">《常用命令行监控工具》</a></p>
<ul>
<li>top、sar、tsar、nload</li>
</ul>
</li>
<li>
<p><a href="http://blog.jobbole.com/96846/">《20个命令行工具监控 Linux 系统性能》</a></p>
</li>
<li>
<p><a href="https://my.oschina.net/feichexia/blog/196575">《JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解》</a></p>
</li>
</ul>
<h2 id="apm">APM</h2>
<p>APM —  Application Performance Management</p>
<ul>
<li>
<p><a href="http://bigbully.github.io/Dapper-translation/">《Dapper，大规模分布式系统的跟踪系统》</a></p>
</li>
<li>
<p><a href="http://opentracing.io">CNCF OpenTracing</a>，<a href="https://github.com/opentracing-contrib/opentracing-specification-zh">中文版</a></p>
</li>
<li>
<p>主要开源软件，按字母排序</p>
<ul>
<li><a href="https://github.com/apache/incubator-skywalking">Apache SkyWalking</a></li>
<li><a href="https://github.com/dianping/cat">CAT</a></li>
<li><a href="https://github.com/jaegertracing/jaeger">CNCF jaeger</a></li>
<li><a href="https://github.com/naver/pinpoint">Pinpoint</a></li>
<li><a href="https://github.com/openzipkin/zipkin">Zipkin</a></li>
</ul>
</li>
<li>
<p><a href="http://www.infoq.com/cn/articles/apm-Pinpoint-practice">《开源APM技术选型与实战》</a></p>
<ul>
<li>主要基于 Google的Dapper（大规模分布式系统的跟踪系统） 思想。</li>
</ul>
</li>
</ul>
<h2 id="统计分析">统计分析</h2>
<ul>
<li>
<p><a href="https://zhuanlan.zhihu.com/p/25195217">《流量统计的基础：埋点》</a></p>
<ul>
<li>常用指标：访问与访客、停留时长、跳出率、退出率、转化率、参与度</li>
</ul>
</li>
<li>
<p><a href="http://www.25xt.com/company/17066.html">《APP埋点常用的统计工具、埋点目标和埋点内容》</a></p>
<ul>
<li>第三方统计：友盟、百度移动、魔方、App Annie、talking data、神策数据等。</li>
</ul>
</li>
<li>
<p><a href="https://tech.meituan.com/mt-mobile-analytics-practice.html">《美团点评前端无痕埋点实践》</a></p>
<ul>
<li>所谓无痕、即通过可视化工具配置采集节点，在前端自动解析配置并上报埋点数据，而非硬编码。</li>
</ul>
</li>
</ul>
<h2 id="持续集成cicd">持续集成(CI/CD)</h2>
<ul>
<li><a href="http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html">《持续集成是什么？》</a></li>
<li><a href="https://www.testwo.com/article/1170">《8个流行的持续集成工具》</a></li>
</ul>
<h3 id="jenkins">Jenkins</h3>
<ul>
<li><a href="https://www.liaoxuefeng.com/article/001463233913442cdb2d1bd1b1b42e3b0b29eb1ba736c5e000">《使用Jenkins进行持续集成》</a></li>
</ul>
<h3 id="环境分离">环境分离</h3>
<p>开发、测试、生成环境分离。</p>
<ul>
<li><a href="https://my.oschina.net/sancuo/blog/214904">《开发环境、生产环境、测试环境的基本理解和区》</a></li>
</ul>
<h2 id="自动化运维">自动化运维</h2>
<h3 id="ansible">Ansible</h3>
<ul>
<li><a href="http://www.ansible.com.cn/">《Ansible中文权威指南》</a></li>
<li><a href="https://www.cnblogs.com/heiye123/articles/7855890.html">《Ansible基础配置和企业级项目实用案例》</a></li>
</ul>
<h3 id="puppet">puppet</h3>
<ul>
<li><a href="https://www.cnblogs.com/keerya/p/8040071.html">《自动化运维工具——puppet详解》</a></li>
</ul>
<h3 id="chef">chef</h3>
<ul>
<li><a href="https://www.ibm.com/developerworks/cn/cloud/library/1407_caomd_chef/">《Chef 的安装与使用》</a></li>
</ul>
<h2 id="测试">测试</h2>
<h3 id="tdd-理论">TDD 理论</h3>
<ul>
<li><a href="https://www.jianshu.com/p/62f16cd4fef3">《深度解读 - TDD（测试驱动开发）》</a>
<ul>
<li>基于测试用例编码功能代码，XP（Extreme Programming）的核心实践.</li>
<li>好处：一次关注一个点，降低思维负担；迎接需求变化或改善代码的设计；提前澄清需求；快速反馈；</li>
</ul>
</li>
</ul>
<h3 id="单元测试">单元测试</h3>
<ul>
<li><a href="https://www.cnblogs.com/happyzm/p/6482886.html">《Java单元测试之JUnit篇》</a></li>
<li><a href="https://blog.csdn.net/hotdust/article/details/53406086">《JUnit 4 与 TestNG 对比》</a>
<ul>
<li>TestNG 覆盖 JUnit 功能，适用于更复杂的场景。</li>
</ul>
</li>
<li><a href="https://blog.csdn.net/wqetfg/article/details/50900512">《单元测试主要的测试功能点》</a>
<ul>
<li>模块接口测试、局部数据结构测试、路径测试 、错误处理测试、边界条件测试 。</li>
</ul>
</li>
</ul>
<h3 id="压力测试">压力测试</h3>
<ul>
<li><a href="https://blog.csdn.net/blueheart20/article/details/52170790">《Apache ab 测试使用指南》</a></li>
<li><a href="https://www.cnblogs.com/binyue/p/6141088.html">《大型网站压力测试及优化方案》</a></li>
<li><a href="http://news.chinabyte.com/466/14126966.shtml">《10大主流压力/负载/性能测试工具推荐》</a></li>
<li><a href="http://quentinxxz.iteye.com/blog/2249799">《真实流量压测工具 tcpcopy应用浅析》</a></li>
<li><a href="https://www.cnblogs.com/jwentest/p/7136727.html">《nGrinder 简易使用教程》</a></li>
</ul>
<h3 id="全链路压测">全链路压测</h3>
<ul>
<li><a href="http://www.infoq.com/cn/articles/jd-618-upgrade-full-link-voltage-test-program-forcebot">《京东618：升级全链路压测方案，打造军演机器人ForceBot》</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/30306892">《饿了么全链路压测的探索与实践》</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/28355759">《四大语言，八大框架｜滴滴全链路压测解决之道》</a></li>
<li><a href="https://www.jianshu.com/p/27060fd61f72">《全链路压测经验》</a></li>
</ul>
<h3 id="ab-灰度-蓝绿测试">A/B 、灰度、蓝绿测试</h3>
<ul>
<li>
<p><a href="https://testerhome.com/topics/11165">《技术干货 | AB 测试和灰度发布探索及实践》</a></p>
</li>
<li>
<p><a href="http://blog.51cto.com/purplegrape/1403123">《nginx 根据IP 进行灰度发布》</a></p>
</li>
<li>
<p><a href="https://www.v2ex.com/t/344341">《蓝绿部署、A/B 测试以及灰度发布》</a></p>
</li>
</ul>
<h2 id="虚拟化">虚拟化</h2>
<ul>
<li><a href="https://blog.csdn.net/enweitech/article/details/52910082">《VPS的三种虚拟技术OpenVZ、Xen、KVM优缺点比较》</a></li>
</ul>
<h3 id="kvm">KVM</h3>
<ul>
<li><a href="http://blog.chinaunix.net/uid-20201831-id-5775661.html">《KVM详解，太详细太深入了，经典》</a></li>
<li><a href="https://www.coderxing.com/kvm-install.html">《【图文】KVM 虚拟机安装详解》</a></li>
</ul>
<h3 id="xen">Xen</h3>
<ul>
<li><a href="https://www.cnblogs.com/sddai/p/5931201.html">《Xen虚拟化基本原理详解》</a></li>
</ul>
<h3 id="openvz">OpenVZ</h3>
<ul>
<li><a href="https://blog.csdn.net/longerzone/article/details/44829255">《开源Linux容器 OpenVZ 快速上手指南》</a></li>
</ul>
<h2 id="容器技术">容器技术</h2>
<h3 id="docker">Docker</h3>
<ul>
<li><a href="https://www.cnblogs.com/SzeCheng/p/6822905.html">《几张图帮你理解 docker 基本原理及快速入门》</a></li>
<li><a href="https://draveness.me/docker">《Docker 核心技术与实现原理》</a></li>
<li><a href="http://www.runoob.com/docker/docker-tutorial.html">《Docker 教程》</a></li>
</ul>
<h2 id="云技术">云技术</h2>
<h3 id="openstack">OpenStack</h3>
<ul>
<li><a href="https://www.cnblogs.com/klb561/p/8660264.html">《OpenStack构架知识梳理》</a></li>
</ul>
<h2 id="devops">DevOps</h2>
<ul>
<li><a href="https://www.cnblogs.com/jetzhang/p/6068773.html">《一分钟告诉你究竟DevOps是什么鬼？》</a></li>
<li><a href="http://www.infoq.com/cn/articles/detail-analysis-of-devops">《DevOps详解》</a></li>
</ul>
<h2 id="文档管理">文档管理</h2>
<ul>
<li><a href="http://www.confluence.cn/">Confluence-收费文档管理系统</a></li>
<li>GitLab?</li>
<li>Wiki</li>
</ul>
<h1 id="中间件">中间件</h1>
<h2 id="web-server">Web Server</h2>
<h3 id="nginx">Nginx</h3>
<ul>
<li>
<p><a href="https://blog.csdn.net/qq_25797077/article/details/52200722">《Ngnix的基本学习-多进程和Apache的比较》</a></p>
<ul>
<li>Nginx 通过异步非阻塞的事件处理机制实现高并发。Apache 每个请求独占一个线程，非常消耗系统资源。</li>
<li>事件驱动适合于IO密集型服务(Nginx)，多进程或线程适合于CPU密集型服务(Apache)，所以Nginx适合做反向代理，而非web服务器使用。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/cunkouzh/p/5410154.html">《nginx与Apache的对比以及优缺点》</a></p>
<ul>
<li>nginx只适合静态和反向代理，不适合处理动态请求。</li>
</ul>
</li>
</ul>
<h3 id="openresty">OpenResty</h3>
<ul>
<li><a href="http://openresty.org/cn/">官方网站</a></li>
<li><a href="http://www.linkedkeeper.com/detail/blog.action?bid=1034">《浅谈 OpenResty》</a>
<ul>
<li>通过 Lua 模块可以在Nginx上进行开发。</li>
</ul>
</li>
</ul>
<h3 id="apache-httpd">Apache Httpd</h3>
<ul>
<li><a href="http://httpd.apache.org/">官方网站</a></li>
</ul>
<h3 id="tomcat">Tomcat</h3>
<h4 id="架构原理">架构原理</h4>
<ul>
<li>
<p><a href="https://www.cnblogs.com/hggen/p/6264475.html">《TOMCAT原理详解及请求过程》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/crazylqy/p/4706223.html">《Tomcat服务器原理详解》</a></p>
</li>
<li>
<p><a href="https://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/">《Tomcat 系统架构与设计模式,第 1 部分: 工作原理》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/xlgen157387/article/details/79006434">《四张图带你了解Tomcat系统架构》</a></p>
</li>
<li>
<p><a href="https://www.futurehosting.com/blog/jboss-vs-tomcat-choosing-a-java-application-server/">《JBoss vs. Tomcat: Choosing A Java Application Server》</a></p>
<ul>
<li>Tomcat 是轻量级的 Serverlet 容器，没有实现全部 JEE 特性（比如持久化和事务处理），但可以通过其他组件代替，比如Srping。</li>
<li>Jboss 实现全部了JEE特性，软件开源免费、文档收费。</li>
</ul>
</li>
</ul>
<h4 id="调优方案">调优方案</h4>
<ul>
<li>
<p><a href="https://www.cnblogs.com/sunfenqing/p/7339058.html">《Tomcat 调优方案》</a></p>
<ul>
<li>启动NIO模式（或者APR）；调整线程池；禁用AJP连接器（Nginx+tomcat的架构，不需要AJP）；</li>
</ul>
</li>
<li>
<p><a href="http://blog.chinaunix.net/uid-20662363-id-3012760.html">《tomcat http协议与ajp协议》</a></p>
</li>
<li>
<p><a href="http://dmouse.iteye.com/blog/1354527">《AJP与HTTP比较和分析》</a></p>
<ul>
<li>AJP 协议（8009端口）用于降低和前端Server（如Apache，而且需要支持AJP协议）的连接数(前端)，通过长连接提高性能。</li>
<li>并发高时，AJP协议优于HTTP协议。</li>
</ul>
</li>
</ul>
<h3 id="jetty">Jetty</h3>
<ul>
<li><a href="https://www.ibm.com/developerworks/cn/java/j-lo-jetty/">《Jetty 的工作原理以及与 Tomcat 的比较》</a></li>
<li><a href="https://blog.csdn.net/doutao6677/article/details/51957288">《jetty和tomcat优势比较》</a>
<ul>
<li>架构比较:Jetty的架构比Tomcat的更为简单。</li>
<li>性能比较：Jetty和Tomcat性能方面差异不大，Jetty默认采用NIO结束在处理I/O请求上更占优势，Tomcat默认采用BIO处理I/O请求，Tomcat适合处理少数非常繁忙的链接，处理静态资源时性能较差。</li>
<li>其他方面：Jetty的应用更加快速，修改简单，对新的Servlet规范的支持较好;Tomcat 对JEE和Servlet 支持更加全面。</li>
</ul>
</li>
</ul>
<h2 id="缓存">缓存</h2>
<ul>
<li><a href="https://blog.csdn.net/clementad/article/details/48229243">《缓存失效策略（FIFO 、LRU、LFU三种算法的区别）》</a></li>
</ul>
<h3 id="本地缓存">本地缓存</h3>
<ul>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-er-pian-ff1a-feng-kuang-yuan-shi-ren/42-xing-neng-zhi-ben-di-huan-cun/421-ying-yong-ceng-ben-di-huan-cun/4211.html">《HashMap本地缓存》</a></p>
</li>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-er-pian-ff1a-feng-kuang-yuan-shi-ren/42-xing-neng-zhi-ben-di-huan-cun/421-ying-yong-ceng-ben-di-huan-cun/4212-ehcache.html">《EhCache本地缓存》</a></p>
<ul>
<li>堆内、堆外、磁盘三级缓存。</li>
<li>可按照缓存空间容量进行设置。</li>
<li>按照时间、次数等过期策略。</li>
</ul>
</li>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-er-pian-ff1a-feng-kuang-yuan-shi-ren/42-xing-neng-zhi-ben-di-huan-cun/421-ying-yong-ceng-ben-di-huan-cun/4213-guava-cache.html">《Guava Cache》</a></p>
<ul>
<li>简单轻量、无堆外、磁盘缓存。</li>
</ul>
</li>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-er-pian-ff1a-feng-kuang-yuan-shi-ren/42-xing-neng-zhi-ben-di-huan-cun/422-fu-wu-duan-ben-di-huan-cun/nginx-ben-di-huan-cun.html">《Nginx本地缓存》</a></p>
</li>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-er-pian-ff1a-feng-kuang-yuan-shi-ren/42-xing-neng-zhi-ben-di-huan-cun/422-fu-wu-duan-ben-di-huan-cun/4222-pagespeed.html">《Pagespeed—懒人工具，服务器端加速》</a></p>
</li>
</ul>
<h2 id="客户端缓存">客户端缓存</h2>
<ul>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-er-pian-ff1a-feng-kuang-yuan-shi-ren/42-xing-neng-zhi-ben-di-huan-cun/423-ke-hu-duan-huan-cun.html">《浏览器端缓存》</a></p>
<ul>
<li>主要是利用 Cache-Control 参数。</li>
</ul>
</li>
<li>
<p><a href="https://mp.weixin.qq.com/s/qHm_dJBhVbv0pJs8Crp77w">《H5 和移动端 WebView 缓存机制解析与实战》</a></p>
</li>
</ul>
<h2 id="服务端缓存">服务端缓存</h2>
<h3 id="web缓存">Web缓存</h3>
<ul>
<li><a href="https://github.com/jiangwenyuan/nuster">nuster</a> - nuster cache</li>
<li><a href="https://github.com/varnishcache/varnish-cache">varnish</a> - varnish cache</li>
<li><a href="https://github.com/squid-cache/squid">squid</a> - squid cache</li>
</ul>
<h3 id="memcached">Memcached</h3>
<ul>
<li>
<p><a href="http://www.runoob.com/Memcached/Memcached-tutorial.html">《Memcached 教程》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/chenleixing/article/details/47035453">《深入理解Memcached原理》</a></p>
<ul>
<li>采用多路复用技术提高并发性。</li>
<li>slab分配算法： memcached给Slab分配内存空间，默认是1MB。分配给Slab之后 把slab的切分成大小相同的chunk，Chunk是用于缓存记录的内存空间，Chunk 的大小默认按照1.25倍的速度递增。好处是不会频繁申请内存，提高IO效率，坏处是会有一定的内存浪费。</li>
</ul>
</li>
<li>
<p><a href="https://www.jianshu.com/p/36e5cd400580">《Memcached软件工作原理》</a></p>
</li>
<li>
<p><a href="http://zhihuzeye.com/archives/2361">《Memcache技术分享：介绍、使用、存储、算法、优化、命中率》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/liu251890347/article/details/37690045">《memcache 中 add 、 set 、replace 的区别》</a></p>
<ul>
<li>区别在于当key存在还是不存在时，返回值是true和false的。</li>
</ul>
</li>
<li>
<p><a href="https://pan.baidu.com/s/1qX00Lti?errno=0&amp;errmsg=Auth%20Login%20Sucess&amp;&amp;bduss=&amp;ssnerror=0&amp;traceid="><strong>《memcached全面剖析》</strong></a></p>
</li>
</ul>
<h3 id="redis">Redis</h3>
<ul>
<li>
<p><a href="http://www.runoob.com/redis/redis-tutorial.html">《Redis 教程》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/wcf373722432/article/details/78678504">《redis底层原理》</a></p>
<ul>
<li>使用 ziplist 存储链表，ziplist是一种压缩链表，它的好处是更能节省内存空间，因为它所存储的内容都是在连续的内存区域当中的。</li>
<li>使用 skiplist(跳跃表)来存储有序集合对象、查找上先从高Level查起、时间复杂度和红黑树相当，实现容易，无锁、并发性好。</li>
</ul>
</li>
<li>
<p><a href="http://doc.redisfans.com/topic/persistence.html">《Redis持久化方式》</a></p>
<ul>
<li>RDB方式：定期备份快照，常用于灾难恢复。优点：通过fork出的进程进行备份，不影响主进程、RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。缺点：会丢数据。</li>
<li>AOF方式：保存操作日志方式。优点：恢复时数据丢失少，缺点：文件大，回复慢。</li>
<li>也可以两者结合使用。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/chunlongyu/article/details/53346436">《分布式缓存--序列3--原子操作与CAS乐观锁》</a></p>
</li>
</ul>
<h4 id="架构">架构</h4>
<ul>
<li><a href="https://blog.csdn.net/sunhuiliang85/article/details/73656830">《Redis单线程架构》</a></li>
</ul>
<h4 id="回收策略">回收策略</h4>
<ul>
<li><a href="https://blog.csdn.net/qq_29108585/article/details/63251491">《redis的回收策略》</a></li>
</ul>
<h3 id="tair">Tair</h3>
<ul>
<li><a href="https://github.com/alibaba/tair">官方网站</a></li>
<li><a href="http://blog.csdn.net/farphone/article/details/53522383">《Tair和Redis的对比》</a></li>
<li>特点：可以配置备份节点数目，通过异步同步到备份节点</li>
<li>一致性Hash算法。</li>
<li>架构：和Hadoop 的设计思想类似，有Configserver，DataServer，Configserver 通过心跳来检测，Configserver也有主备关系。</li>
</ul>
<p>几种存储引擎:</p>
<ul>
<li>MDB，完全内存性，可以用来存储Session等数据。</li>
<li>Rdb（类似于Redis），轻量化，去除了aof之类的操作，支持Restfull操作</li>
<li>LDB（LevelDB存储引擎），持久化存储，LDB 作为rdb的持久化，google实现，比较高效，理论基础是LSM(Log-Structured-Merge Tree)算法，现在内存中修改数据，达到一定量时（和内存汇总的旧数据一同写入磁盘）再写入磁盘，存储更加高效，县比喻Hash算法。</li>
<li>Tair采用共享内存来存储数据，如果服务挂掉（非服务器），重启服务之后，数据亦然还在。</li>
</ul>
<h2 id="消息队列">消息队列</h2>
<ul>
<li>
<p><a href="https://www.cnblogs.com/charlesblc/p/6045238.html">《消息队列-推/拉模式学习 &amp; ActiveMQ及JMS学习》</a></p>
<ul>
<li>RabbitMQ 消费者默认是推模式（也支持拉模式）。</li>
<li>Kafka 默认是拉模式。</li>
<li>Push方式：优点是可以尽可能快地将消息发送给消费者，缺点是如果消费者处理能力跟不上，消费者的缓冲区可能会溢出。</li>
<li>Pull方式：优点是消费端可以按处理能力进行拉去，缺点是会增加消息延迟。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/yunfeng482/article/details/72856762">《Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和区别》</a></p>
</li>
</ul>
<h3 id="消息总线">消息总线</h3>
<p>消息总线相当于在消息队列之上做了一层封装，统一入口，统一管控、简化接入成本。</p>
<ul>
<li><a href="https://blog.csdn.net/yanghua_kobe/article/details/43877281">《消息总线VS消息队列》</a></li>
</ul>
<h3 id="消息的顺序">消息的顺序</h3>
<ul>
<li><a href="https://www.cnblogs.com/cjsblog/p/8267892.html">《如何保证消费者接收消息的顺序》</a></li>
</ul>
<h3 id="rabbitmq">RabbitMQ</h3>
<p>支持事务，推拉模式都是支持、适合需要可靠性消息传输的场景。</p>
<ul>
<li><a href="https://blog.csdn.net/whoamiyang/article/details/54954780">《RabbitMQ的应用场景以及基本原理介绍》</a></li>
<li><a href="https://www.jianshu.com/p/79ca08116d57">《消息队列之 RabbitMQ》</a></li>
<li><a href="https://blog.csdn.net/u013256816/article/details/55515234">《RabbitMQ之消息确认机制（事务+Confirm）》</a></li>
</ul>
<h3 id="rocketmq">RocketMQ</h3>
<p>Java实现，推拉模式都是支持，吞吐量逊于Kafka。可以保证消息顺序。</p>
<ul>
<li><a href="https://www.jianshu.com/p/824066d70da8">《RocketMQ 实战之快速入门》</a></li>
<li><a href="http://www.iocoder.cn/categories/RocketMQ/?vip&amp;architect-awesome">《RocketMQ 源码解析》</a></li>
</ul>
<h3 id="activemq">ActiveMQ</h3>
<p>纯Java实现，兼容JMS，可以内嵌于Java应用中。</p>
<ul>
<li><a href="https://www.cnblogs.com/wintersun/p/3962302.html">《ActiveMQ消息队列介绍》</a></li>
</ul>
<h3 id="kafka">Kafka</h3>
<p>高吞吐量、采用拉模式。适合高IO场景，比如日志同步。</p>
<ul>
<li><a href="http://kafka.apache.org/">官方网站</a></li>
<li><a href="https://blog.csdn.net/allthesametome/article/details/47362451">《各消息队列对比，Kafka深度解析，众人推荐，精彩好文！》</a></li>
<li><a href="http://lxw1234.com/archives/2015/10/538.htm">《Kafka分区机制介绍与示例》</a></li>
</ul>
<h3 id="redis-消息推送">Redis 消息推送</h3>
<p>生产者、消费者模式完全是客户端行为，list 和 拉模式实现，阻塞等待采用 blpop 指令。</p>
<ul>
<li><a href="https://blog.csdn.net/qq_34212276/article/details/78455004">《Redis学习笔记之十：Redis用作消息队列》</a></li>
</ul>
<h3 id="zeromq">ZeroMQ</h3>
<p>TODO</p>
<h2 id="定时调度">定时调度</h2>
<h3 id="单机定时调度">单机定时调度</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/shuaiqing/p/7742382.html">《linux定时任务cron配置》</a></p>
</li>
<li>
<p><a href="https://my.oschina.net/daquan/blog/483305">《Linux cron运行原理》</a></p>
<ul>
<li>fork 进程 + sleep 轮询</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/drift-ice/p/3817269.html">《Quartz使用总结》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/wenniuwuren/article/details/42082981/">《Quartz源码解析 ---- 触发器按时启动原理》</a></p>
</li>
<li>
<p><a href="https://www.jianshu.com/p/bab8e4e32952">《quartz原理揭秘和源码解读》</a></p>
<ul>
<li>定时调度在 QuartzSchedulerThread 代码中，while()无限循环，每次循环取出时间将到的trigger，触发对应的job，直到调度器线程被关闭。</li>
</ul>
</li>
</ul>
<h3 id="分布式定时调度">分布式定时调度</h3>
<ul>
<li>
<p><a href="https://blog.csdn.net/qq_16216221/article/details/70314337">《这些优秀的国产分布式任务调度系统，你用过几个？》</a></p>
<ul>
<li>opencron、LTS、XXL-JOB、Elastic-Job、Uncode-Schedule、Antares</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/zhenyuyaodidiao/p/4755649.html">《Quartz任务调度的基本实现原理》</a></p>
<ul>
<li>Quartz集群中，独立的Quartz节点并不与另一其的节点或是管理节点通信，而是通过相同的数据库表来感知到另一Quartz应用的</li>
</ul>
</li>
<li>
<p><a href="http://www.iocoder.cn/categories/Elastic-Job-Lite/?vip&amp;architect-awesome">《Elastic-Job-Lite 源码解析》</a></p>
</li>
<li>
<p><a href="http://www.iocoder.cn/categories/Elastic-Job-Cloud/?vip&amp;architect-awesome">《Elastic-Job-Cloud 源码解析》</a></p>
</li>
</ul>
<h2 id="rpc">RPC</h2>
<ul>
<li>
<p><a href="https://blog.csdn.net/top_code/article/details/54615853">《从零开始实现RPC框架 - RPC原理及实现》</a></p>
<ul>
<li>核心角色：Server: 暴露服务的服务提供方、Client: 调用远程服务的服务消费方、Registry: 服务注册与发现的注册中心。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/testcs_dn/article/details/78050590">《分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较》</a></p>
</li>
</ul>
<h3 id="dubbo">Dubbo</h3>
<ul>
<li><a href="http://dubbo.apache.org/">官方网站</a></li>
<li><a href="https://www.cnblogs.com/steven520213/p/7606598.html">dubbo实现原理简单介绍</a></li>
</ul>
<p>** SPI **<br>
TODO</p>
<h3 id="thrift">Thrift</h3>
<ul>
<li><a href="http://thrift.apache.org/">官方网站</a></li>
<li><a href="https://blog.csdn.net/kesonyk/article/details/50924489">《Thrift RPC详解》</a>
<ul>
<li>支持多语言，通过中间语言定义接口。</li>
</ul>
</li>
</ul>
<h3 id="grpc">gRPC</h3>
<p>服务端可以认证加密，在外网环境下，可以保证数据安全。</p>
<ul>
<li><a href="https://grpc.io/">官方网站</a></li>
<li><a href="https://www.cnblogs.com/LBSer/p/4853234.html">《你应该知道的RPC原理》</a></li>
</ul>
<h2 id="数据库中间件">数据库中间件</h2>
<h3 id="sharding-jdbc">Sharding Jdbc</h3>
<ul>
<li><a href="http://shardingjdbc.io/">官网</a></li>
</ul>
<h2 id="日志系统">日志系统</h2>
<h3 id="日志搜集">日志搜集</h3>
<ul>
<li><a href="http://cjting.me/misc/build-log-system-with-elkb/">《从零开始搭建一个ELKB日志收集系统》</a></li>
<li><a href="https://blog.csdn.net/lzw_2006/article/details/51280058">《用ELK搭建简单的日志收集分析系统》</a></li>
<li><a href="https://www.cnblogs.com/beginmind/p/6058194.html">《日志收集系统-探究》</a></li>
</ul>
<h2 id="配置中心">配置中心</h2>
<ul>
<li>
<p><a href="https://github.com/ctripcorp/apollo">Apollo - 携程开源的配置中心应用</a></p>
<ul>
<li>Spring Boot 和 Spring Cloud</li>
<li>支持推、拉模式更新配置</li>
<li>支持多种语言</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/u011320740/article/details/78742625">《基于zookeeper实现统一配置管理》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/shamo89/p/8016908.html">《 Spring Cloud Config 分布式配置中心使用教程》</a></p>
</li>
</ul>
<p>servlet 3.0 异步特性可用于配置中心的客户端</p>
<ul>
<li><a href="https://www.cnblogs.com/dogdogwang/p/7151866.html">《servlet3.0 新特性——异步处理》</a></li>
</ul>
<h2 id="api-网关">API 网关</h2>
<p>主要职责：请求转发、安全认证、协议转换、容灾。</p>
<ul>
<li>
<p><a href="http://yunlzheng.github.io/2017/03/14/the-things-about-api-gateway/">《API网关那些儿》</a></p>
</li>
<li>
<p><a href="http://www.infoq.com/cn/news/2016/07/API-background-architecture-floo">《谈API网关的背景、架构以及落地方案》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/zhanglh046/article/details/78651993">《使用Zuul构建API Gateway》</a></p>
</li>
<li>
<p><a href="http://www.iocoder.cn/categories/Spring-Cloud-Gateway/?vip&amp;architect-awesome">《Spring Cloud Gateway 源码解析》</a></p>
</li>
<li>
<p><a href="https://mp.weixin.qq.com/s/LIq2CiXJQmmjBC0yvYLY5A">《HTTP API网关选择之一Kong介绍》</a></p>
</li>
</ul>
<h1 id="网络">网络</h1>
<h2 id="协议">协议</h2>
<h3 id="osi-七层协议">OSI 七层协议</h3>
<ul>
<li><a href="https://www.cnblogs.com/Robin-YB/p/6668762.html">《OSI七层协议模型、TCP/IP四层模型学习笔记》</a></li>
</ul>
<h3 id="tcpip">TCP/IP</h3>
<ul>
<li><a href="https://www.cnblogs.com/onepixel/p/7092302.html">《深入浅出 TCP/IP 协议》</a></li>
<li><a href="https://blog.csdn.net/whuslei/article/details/6667471/">《TCP协议中的三次握手和四次挥手》</a></li>
</ul>
<h3 id="http">HTTP</h3>
<ul>
<li><a href="https://www.cnblogs.com/wangning528/p/6388464.html">《http协议详解(超详细)》</a></li>
</ul>
<h3 id="http20">HTTP2.0</h3>
<ul>
<li><a href="https://blog.csdn.net/zhuyiquan/article/details/69257126">《HTTP 2.0 原理详细分析》</a></li>
<li><a href="https://blog.csdn.net/u012657197/article/details/77877840">《HTTP2.0的基本单位为二进制帧》</a>
<ul>
<li>利用二进制帧负责传输。</li>
<li>多路复用。</li>
</ul>
</li>
</ul>
<h3 id="https">HTTPS</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/zhangshitong/p/6478721.html">《https原理通俗了解》</a></p>
<ul>
<li>使用非对称加密协商加密算法</li>
<li>使用对称加密方式传输数据</li>
<li>使用第三方机构签发的证书，来加密公钥，用于公钥的安全传输、防止被中间人串改。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/enweitech/article/details/53213862">《八大免费SSL证书-给你的网站免费添加Https安全加密》</a></p>
</li>
</ul>
<h2 id="网络模型">网络模型</h2>
<ul>
<li>
<p><a href="http://blog.51cto.com/litaotao/1289790">《web优化必须了解的原理之I/o的五种模型和web的三种工作模式》</a></p>
<ul>
<li>五种I/O模型：阻塞I/O，非阻塞I/O，I/O复用、事件(信号)驱动I/O、异步I/O，前四种I/O属于同步操作，I/O的第一阶段不同、第二阶段相同，最后的一种则属于异步操作。</li>
<li>三种 Web Server 工作方式：Prefork(多进程)、Worker方式(线程方式)、Event方式。</li>
</ul>
</li>
<li>
<p><a href="http://www.cnblogs.com/Anker/p/3265058.html">《select、poll、epoll之间的区别总结》</a></p>
<ul>
<li>select，poll，epoll本质上都是同步I/O，因为他们都需要在读写事件就绪后自己负责进行读写，也就是说这个读写过程是阻塞的。</li>
<li>select 有打开文件描述符数量限制，默认1024（2048 for x64），100万并发，就要用1000个进程、切换开销大；poll采用链表结构，没有数量限制。</li>
<li>select，poll “醒着”的时候要遍历整个fd集合，而epoll在“醒着”的时候只要判断一下就绪链表是否为空就行了，通过回调机制节省大量CPU时间；select，poll每次调用都要把fd集合从用户态往内核态拷贝一次，而epoll只要一次拷贝。</li>
<li>poll会随着并发增加，性能逐渐下降，epoll采用红黑树结构，性能稳定，不会随着连接数增加而降低。</li>
</ul>
</li>
<li>
<p><a href="http://xingyunbaijunwei.blog.163.com/blog/static/76538067201241685556302/">《select，poll，epoll比较  》</a></p>
<ul>
<li>在连接数少并且连接都十分活跃的情况下，select和poll的性能可能比epoll好，毕竟epoll的通知机制需要很多函数回调。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/geason/p/5774096.html">《深入理解Java NIO》</a></p>
<ul>
<li>NIO 是一种同步非阻塞的 IO 模型。同步是指线程不断轮询 IO 事件是否就绪，非阻塞是指线程在等待 IO 的时候，可以同时做其他任务</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/skiof007/article/details/52873421">《BIO与NIO、AIO的区别》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/u013074465/article/details/46276967">《两种高效的服务器设计模型：Reactor和Proactor模型》</a></p>
</li>
</ul>
<h3 id="epoll">Epoll</h3>
<ul>
<li><a href="https://www.cnblogs.com/fnlingnzb-learner/p/5835573.html">《epoll使用详解（精髓）》</a></li>
</ul>
<h3 id="java-nio">Java NIO</h3>
<ul>
<li><a href="https://www.cnblogs.com/geason/p/5774096.html">《深入理解Java NIO》</a></li>
<li><a href="https://blog.csdn.net/xidianliuy/article/details/51612676">《Java NIO编写Socket服务器的一个例子》</a></li>
</ul>
<h3 id="kqueue">kqueue</h3>
<ul>
<li><a href="http://www.cnblogs.com/luminocean/p/5631336.html">《kqueue用法简介》</a></li>
</ul>
<h2 id="连接和短连接">连接和短连接</h2>
<ul>
<li><a href="https://www.cnblogs.com/pangguoping/p/5571422.html">《TCP/IP系列——长连接与短连接的区别》</a></li>
</ul>
<h2 id="框架">框架</h2>
<ul>
<li><a href="https://blog.csdn.net/excellentyuxiao/article/details/53390408">《Netty原理剖析》</a>
<ul>
<li>Reactor 模式介绍。</li>
<li>Netty 是 Reactor 模式的一种实现。</li>
</ul>
</li>
</ul>
<h2 id="零拷贝zero-copy">零拷贝（Zero-copy）</h2>
<ul>
<li><a href="https://www.cnblogs.com/xys1228/p/6088805.html">《对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解》</a>
<ul>
<li>多个物理分离的buffer，通过逻辑上合并成为一个，从而避免了数据在内存之间的拷贝。</li>
</ul>
</li>
</ul>
<h2 id="序列化二进制协议">序列化(二进制协议)</h2>
<h3 id="hessian">Hessian</h3>
<ul>
<li><a href="https://www.cnblogs.com/happyday56/p/4268249.html">《Hessian原理分析》</a><br>
Binary-RPC;不仅仅是序列化</li>
</ul>
<h3 id="protobuf">Protobuf</h3>
<ul>
<li>
<p><a href="https://blog.csdn.net/antgan/article/details/52103966">《Protobuf协议的Java应用例子》</a><br>
Goolge出品、占用空间和效率完胜其他序列化类库，如Hessian；需要编写  .proto 文件。</p>
</li>
<li>
<p><a href="https://worktile.com/tech/share/prototol-buffers">《Protocol Buffers序列化协议及应用》</a></p>
<ul>
<li>关于协议的解释；缺点：可读性差;</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/eric520zenobia/article/details/53766571">《简单的使用 protobuf 和 protostuff》</a></p>
<ul>
<li>protostuff 的好处是不用写 .proto 文件，Java 对象直接就可以序列化。</li>
</ul>
</li>
</ul>
<h1 id="数据库">数据库</h1>
<h2 id="基础理论">基础理论</h2>
<h3 id="数据库设计的三大范式">数据库设计的三大范式</h3>
<ul>
<li><a href="https://www.cnblogs.com/waj6511988/p/7027127.html">《数据库的三大范式以及五大约束》</a>
<ul>
<li>第一范式：数据表中的每一列（每个字段）必须是不可拆分的最小单元，也就是确保每一列的原子性；</li>
<li>第二范式（2NF）：满足1NF后，要求表中的所有列，都必须依赖于主键，而不能有任何一列与主键没有关系，也就是说一个表只描述一件事情；</li>
<li>第三范式：必须先满足第二范式（2NF），要求：表中的每一列只与主键直接相关而不是间接相关，（表中的每一列只能依赖于主键）；</li>
</ul>
</li>
</ul>
<h2 id="mysql">MySQL</h2>
<h3 id="原理">原理</h3>
<ul>
<li>
<p><a href="http://www.admin10000.com/document/5372.html">《MySQL的InnoDB索引原理详解》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/xifeijian/article/details/20316775">《MySQL存储引擎－－MyISAM与InnoDB区别》</a></p>
<ul>
<li>两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁</li>
</ul>
</li>
<li>
<p><a href="https://www.2cto.com/database/201211/172380.html">《myisam和innodb索引实现的不同》</a></p>
</li>
</ul>
<h3 id="innodb">InnoDB</h3>
<ul>
<li><a href="https://my.oschina.net/kailuncen/blog/1504217">《一篇文章带你读懂Mysql和InnoDB》</a></li>
</ul>
<h3 id="优化">优化</h3>
<ul>
<li>
<p><a href="http://vdisk.weibo.com/s/muWOT">《MySQL36条军规》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/zhouyusheng/p/8038224.html">《MYSQL性能优化的最佳20+条经验》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/when_less_is_more/article/details/70187459">《SQL优化之道》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/sivkun/p/7518540.html">《mysql数据库死锁的产生原因及解决办法》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/monkey_d_feilong/article/details/52291556">《导致索引失效的可能情况》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/zy_281870667/article/details/51604540">《 MYSQL分页limit速度太慢优化方法》</a></p>
<ul>
<li>原则上就是缩小扫描范围。</li>
</ul>
</li>
</ul>
<h3 id="索引">索引</h3>
<h4 id="聚集索引-非聚集索引">聚集索引, 非聚集索引</h4>
<ul>
<li><a href="https://blog.csdn.net/no_endless/article/details/77073549">《MySQL 聚集索引/非聚集索引简述》</a></li>
<li><a href="https://www.cnblogs.com/zlcxbb/p/5757245.html">《MyISAM和InnoDB的索引实现》</a></li>
</ul>
<p>MyISAM 是非聚集，InnoDB 是聚集</p>
<h4 id="复合索引">复合索引</h4>
<ul>
<li><a href="https://www.cnblogs.com/summer0space/p/7247778.html">《复合索引的优点和注意事项》</a></li>
</ul>
<h4 id="自适应哈希索引ahi">自适应哈希索引(AHI)</h4>
<ul>
<li><a href="https://blog.csdn.net/Linux_ever/article/details/62043708">《InnoDB存储引擎——自适应哈希索引》</a></li>
</ul>
<h3 id="explain">explain</h3>
<ul>
<li><a href="https://segmentfault.com/a/1190000008131735">《MySQL 性能优化神器 Explain 使用分析》</a></li>
</ul>
<h2 id="nosql">NoSQL</h2>
<h3 id="mongodb">MongoDB</h3>
<ul>
<li><a href="http://www.runoob.com/mongodb/mongodb-tutorial.html">MongoDB 教程</a></li>
<li><a href="http://mxdxm.iteye.com/blog/2093603">《Mongodb相对于关系型数据库的优缺点》</a>
<ul>
<li>优点：弱一致性（最终一致），更能保证用户的访问速度；内置GridFS，支持大容量的存储；Schema-less 数据库，不用预先定义结构；内置Sharding；相比于其他NoSQL，第三方支持丰富；性能优越；</li>
<li>缺点：mongodb不支持事务操作；mongodb占用空间过大；MongoDB没有如MySQL那样成熟的维护工具，这对于开发和IT运营都是个值得注意的地方；</li>
</ul>
</li>
</ul>
<h3 id="hbase">Hbase</h3>
<ul>
<li>
<p><a href="http://www.thebigdata.cn/HBase/35831.html">《简明 HBase 入门教程（开篇）》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/qiaoyihang/p/6246424.html">《深入学习HBase架构原理》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/youzhouliu/article/details/67632882">《传统的行存储和（HBase）列存储的区别》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/lifuxiangcaohui/article/details/39891099">《Hbase与传统数据库的区别》</a></p>
<ul>
<li>空数据不存储，节省空间，且适用于并发。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/u014091123/article/details/73163088">《HBase Rowkey设计》</a></p>
<ul>
<li>rowkey 按照字典顺序排列，便于批量扫描。</li>
<li>通过散列可以避免热点。</li>
</ul>
</li>
</ul>
<h1 id="搜索引擎">搜索引擎</h1>
<h2 id="搜索引擎原理">搜索引擎原理</h2>
<ul>
<li><a href="https://www.jianshu.com/p/0193dc44135b">《倒排索引--搜索引擎入门》</a></li>
</ul>
<h2 id="lucene">Lucene</h2>
<ul>
<li><a href="https://www.cnblogs.com/rodge-run/p/6551152.html">《Lucene入门简介》</a></li>
</ul>
<h2 id="elasticsearch">Elasticsearch</h2>
<ul>
<li><a href="https://blog.csdn.net/laoyang360/article/details/52244917">《Elasticsearch学习，请先看这一篇！》</a></li>
<li><a href="https://blog.csdn.net/cyony/article/details/65437708">《Elasticsearch索引原理》</a></li>
</ul>
<h2 id="solr">Solr</h2>
<ul>
<li><a href="https://blog.csdn.net/u011936655/article/details/51960005">《 Apache Solr入门教程》</a></li>
<li><a href="https://blog.csdn.net/convict_eva/article/details/53537837">《elasticsearch与solr比较》</a></li>
</ul>
<h2 id="sphinx">sphinx</h2>
<ul>
<li><a href="http://blog.jobbole.com/101672/">《Sphinx 的介绍和原理探索》</a></li>
</ul>
<h1 id="性能">性能</h1>
<h2 id="性能优化方法论">性能优化方法论</h2>
<ul>
<li>
<p><a href="https://blog.csdn.net/huangwenyi1010/article/details/72673447?ref=myread">《15天的性能优化工作，5方面的调优经验》</a></p>
<ul>
<li>代码层面、业务层面、数据库层面、服务器层面、前端优化。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/tenglizhe/article/details/44563135">《系统性能优化的几个方面》</a></p>
</li>
</ul>
<h2 id="容量评估">容量评估</h2>
<ul>
<li><a href="https://blog.csdn.net/u012528360/article/details/70054156">《联网性能与容量评估的方法论和典型案例》</a></li>
<li><a href="https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&amp;mid=2651959542&amp;idx=1&amp;sn=2494bbea9a855e0e1c3ccd6d2562a600&amp;scene=21#wechat_redirect">《互联网架构，如何进行容量设计？》</a>
<ul>
<li>评估总访问量、评估平均访问量QPS、评估高峰QPS、评估系统、单机极限QPS</li>
</ul>
</li>
</ul>
<h2 id="cdn-网络">CDN 网络</h2>
<ul>
<li><a href="https://www.cnblogs.com/wxiaona/p/5867685.html">《CDN加速原理》</a></li>
<li><a href="https://www.zhihu.com/question/20536932">《国内有哪些比较好的 CDN？》</a></li>
</ul>
<h2 id="连接池">连接池</h2>
<ul>
<li><a href="https://blog.csdn.net/fysuccess/article/details/66972554">《主流Java数据库连接池比较与开发配置实战》</a></li>
</ul>
<h2 id="性能调优">性能调优</h2>
<ul>
<li><a href="https://blog.csdn.net/yethyeth/article/details/73266455">《九大Java性能调试工具，必备至少一款》</a></li>
</ul>
<h1 id="大数据">大数据</h1>
<h2 id="流式计算">流式计算</h2>
<h3 id="storm">Storm</h3>
<ul>
<li><a href="http://storm.apache.org/">官方网站</a></li>
<li><a href="https://blog.csdn.net/uisoul/article/details/77989927">《最详细的Storm入门教程》</a></li>
</ul>
<h3 id="flink">Flink</h3>
<ul>
<li><a href="https://blog.csdn.net/lisi1129/article/details/54844919">《Flink之一 Flink基本原理介绍》</a></li>
</ul>
<h3 id="kafka-stream">Kafka Stream</h3>
<ul>
<li><a href="https://yq.aliyun.com/articles/58382">《Kafka Stream调研：一种轻量级流计算模式》</a></li>
</ul>
<h3 id="应用场景-2">应用场景</h3>
<p>例如：</p>
<ul>
<li>广告相关实时统计；</li>
<li>推荐系统用户画像标签实时更新；</li>
<li>线上服务健康状况实时监测；</li>
<li>实时榜单；</li>
<li>实时数据统计。</li>
</ul>
<h2 id="hadoop">Hadoop</h2>
<ul>
<li><a href="https://blog.csdn.net/houbin0912/article/details/72967178">《用通俗易懂的话说下hadoop是什么,能做什么》</a></li>
<li><a href="http://gitbook.cn/books/5954c9600326c7705af8a92a/index.html">《史上最详细的Hadoop环境搭建》</a></li>
</ul>
<h3 id="hdfs">HDFS</h3>
<ul>
<li><a href="https://segmentfault.com/a/1190000011575458">《【Hadoop学习】HDFS基本原理》</a></li>
</ul>
<h3 id="mapreduce">MapReduce</h3>
<ul>
<li><a href="https://blog.csdn.net/oppo62258801/article/details/72884633">《用通俗易懂的大白话讲解Map/Reduce原理》</a></li>
<li><a href="https://blog.csdn.net/foye12/article/details/78358292">《 简单的map-reduce的java例子》</a></li>
</ul>
<h3 id="yarn">Yarn</h3>
<ul>
<li><a href="http://www.cnblogs.com/codeOfLife/p/5492740.html">《初步掌握Yarn的架构及原理》</a></li>
</ul>
<h2 id="spark">Spark</h2>
<ul>
<li><a href="http://www.cnblogs.com/tgzhu/p/5818374.html">《Spark(一): 基本架构及原理》</a></li>
</ul>
<h1 id="安全">安全</h1>
<h2 id="web-安全">web 安全</h2>
<h3 id="xss">XSS</h3>
<ul>
<li><a href="https://blog.csdn.net/qq_21956483/article/details/54377947">《xss攻击原理与解决方法》</a></li>
</ul>
<h3 id="csrf">CSRF</h3>
<ul>
<li><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/641-web-an-quan-fang-fan/6412-csrf.html">《CSRF原理及防范》</a></li>
</ul>
<h3 id="sql-注入">SQL 注入</h3>
<ul>
<li><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/641-web-an-quan-fang-fan/6413-sql-zhu-ru.html">《SQL注入》</a></li>
</ul>
<h3 id="hash-dos">Hash Dos</h3>
<ul>
<li><a href="http://www.freebuf.com/articles/web/14199.html">《邪恶的JAVA HASH DOS攻击》</a>
<ul>
<li>利用JsonObjet 上传大Json，JsonObject 底层使用HashMap；不同的数据产生相同的hash值，使得构建Hash速度变慢，耗尽CPU。</li>
</ul>
</li>
<li><a href="https://yq.aliyun.com/articles/92194?t=t1">《一种高级的DoS攻击-Hash碰撞攻击》</a></li>
<li><a href="http://www.iteye.com/news/23939/">《关于Hash Collision DoS漏洞：解析与解决方案》</a></li>
</ul>
<h3 id="脚本注入">脚本注入</h3>
<ul>
<li><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/641-web-an-quan-fang-fan/6414-shang-chuan-wen-jian-guo-lv.html">《上传文件漏洞原理及防范》</a></li>
</ul>
<h3 id="漏洞扫描工具">漏洞扫描工具</h3>
<ul>
<li><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/6421-dvwa.html">《DVWA》</a></li>
<li><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/w3af.html">W3af</a></li>
<li><a href="https://blog.csdn.net/xygg0801/article/details/53610640">OpenVAS详解</a></li>
</ul>
<h3 id="验证码">验证码</h3>
<ul>
<li>
<p><a href="https://blog.csdn.net/niaonao/article/details/51112686">《验证码原理分析及实现》</a></p>
</li>
<li>
<p><a href="https://my.oschina.net/jiangbianwanghai/blog/1031031">《详解滑动验证码的实现原理》</a></p>
<ul>
<li>滑动验证码是根据人在滑动滑块的响应时间，拖拽速度，时间，位置，轨迹，重试次数等来评估风险。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/xcj26/p/5242758.html">《淘宝滑动验证码研究》</a></p>
</li>
</ul>
<h2 id="ddos-防范">DDoS 防范</h2>
<ul>
<li><a href="http://netsecurity.51cto.com/art/201601/503799.htm">《学习手册：DDoS的攻击方式及防御手段》</a></li>
<li><a href="http://netsecurity.51cto.com/art/201406/442756.htm">《免费DDoS攻击测试工具大合集》</a></li>
</ul>
<h2 id="用户隐私信息保护">用户隐私信息保护</h2>
<ol>
<li>用户密码非明文保存，加动态salt。</li>
<li>身份证号，手机号如果要显示，用 “*” 替代部分字符。</li>
<li>联系方式在的显示与否由用户自己控制。</li>
<li>TODO</li>
</ol>
<ul>
<li>
<p><a href="https://zhidao.baidu.com/question/1988017976673661587.html">《个人隐私包括哪些》</a></p>
</li>
<li>
<p><a href="https://www.zhihu.com/question/20137108">《在互联网上，隐私的范围包括哪些？》</a></p>
</li>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/642-shu-ju-jia-mi/6425-jia-mi-chang-jing-ff1a-yong-hu-mi-ma-bao-cun.html">《用户密码保存》</a></p>
</li>
</ul>
<h2 id="序列化漏洞">序列化漏洞</h2>
<ul>
<li><a href="https://blog.chaitin.cn/2015-11-11_java_unserialize_rce/">《Lib之过？Java反序列化漏洞通用利用分析》</a></li>
</ul>
<h2 id="加密解密">加密解密</h2>
<h3 id="对称加密">对称加密</h3>
<ul>
<li><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/642-shu-ju-jia-mi/6421-chang-jian-dui-cheng-jia-mi-suan-fa.html">《常见对称加密算法》</a>
<ul>
<li>DES、3DES、Blowfish、AES</li>
<li>DES 采用 56位秘钥，Blowfish 采用1到448位变长秘钥，AES 128，192和256位长度的秘钥。</li>
<li>DES 秘钥太短（只有56位）算法目前已经被 AES 取代，并且 AES 有硬件加速，性能很好。</li>
</ul>
</li>
</ul>
<h3 id="哈希算法">哈希算法</h3>
<ul>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/642-shu-ju-jia-mi/6422-chang-jian-ha-xi-suan-fa-and-hmac.html">《常用的哈希算法》</a></p>
<ul>
<li>MD5 和 SHA-1 已经不再安全，已被弃用。</li>
<li>目前 SHA-256 是比较安全的。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/zhangruhong168/article/details/78033202">《基于Hash摘要签名的公网URL签名验证设计方案》</a></p>
</li>
</ul>
<h3 id="非对称加密">非对称加密</h3>
<ul>
<li><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/642-shu-ju-jia-mi/6424-chang-yong-fei-dui-cheng-jia-mi-suan-fa.html">《常见非对称加密算法》</a>
<ul>
<li>
<p>RSA、DSA、ECDSA(螺旋曲线加密算法)</p>
</li>
<li>
<p>和 RSA 不同的是 DSA 仅能用于数字签名，不能进行数据加密解密，其安全性和RSA相当，但其性能要比RSA快。</p>
</li>
<li>
<p>256位的ECC秘钥的安全性等同于3072位的RSA秘钥。</p>
<p><a href="http://baijiahao.baidu.com/s?id=1578348858092033763&amp;wfr=spider&amp;for=pc">《区块链的加密技术》</a></p>
</li>
</ul>
</li>
</ul>
<h2 id="服务器安全">服务器安全</h2>
<ul>
<li><a href="http://www.freebuf.com/articles/system/121540.html">《Linux强化论：15步打造一个安全的Linux服务器》</a></li>
</ul>
<h2 id="数据安全">数据安全</h2>
<h3 id="数据备份">数据备份</h3>
<p>TODO</p>
<h2 id="网络隔离">网络隔离</h2>
<h3 id="内外网分离">内外网分离</h3>
<p>TODO</p>
<h3 id="登录跳板机">登录跳板机</h3>
<p>在内外环境中通过跳板机登录到线上主机。</p>
<ul>
<li><a href="http://blog.51cto.com/zero01/2062618">《搭建简易堡垒机》</a></li>
</ul>
<h2 id="授权-认证">授权、认证</h2>
<h3 id="rbac">RBAC</h3>
<ul>
<li><a href="https://www.cnblogs.com/zq8024/p/5003050.html">《基于组织角色的权限设计》</a></li>
<li><a href="https://www.cnblogs.com/shijiaqi1066/p/3793894.html">《权限系统与RBAC模型概述》</a></li>
<li><a href="https://blog.csdn.net/he90227/article/details/38663553">《Spring整合Shiro做权限控制模块详细案例分析》</a></li>
</ul>
<h3 id="oauth20">OAuth2.0</h3>
<ul>
<li><a href="http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html">《理解OAuth 2.0》</a></li>
<li><a href="https://www.cnblogs.com/flashsun/p/7424071.html">《一张图搞定OAuth2.0》</a></li>
</ul>
<h3 id="双因素认证2fa">双因素认证（2FA）</h3>
<p>2FA - Two-factor authentication，用于加强登录验证</p>
<p>常用做法是 登录密码 + 手机验证码（或者令牌Key，类似于与网银的 USB key）</p>
<ul>
<li>【《双因素认证（2FA）教程》】(http://www.ruanyifeng.com/blog/2017/11/2fa-tutorial.html)</li>
</ul>
<h3 id="单点登录sso">单点登录(SSO)</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/ywlaker/p/6113927.html">《单点登录原理与简单实现》</a></p>
</li>
<li>
<p><a href="https://github.com/apereo/cas">CAS单点登录框架</a></p>
</li>
</ul>
<h1 id="常用开源框架">常用开源框架</h1>
<h2 id="开源协议">开源协议</h2>
<ul>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/chapter1/di-yi-zhang-ff1a-zhun-bei-qi-cheng/12-guan-yu-kai-yuan/123-kai-yuan-xie-yi-de-xuan-ze.html">《开源协议的选择》</a></p>
</li>
<li>
<p><a href="http://choosealicense.online/">如何选择一个开源软件协议</a></p>
</li>
</ul>
<h2 id="日志框架">日志框架</h2>
<h3 id="log4j-log4j2">Log4j、Log4j2</h3>
<ul>
<li><a href="https://blog.csdn.net/u012422446/article/details/51199724">《log4j 详细讲解》</a></li>
<li><a href="https://blog.csdn.net/vbirdbest/article/details/71751835">《log4j2 实际使用详解》</a></li>
<li><a href="https://my.oschina.net/OutOfMemory/blog/789267">《Log4j1,Logback以及Log4j2性能测试对比》</a>
<ul>
<li>Log4J 异步日志性能优异。</li>
</ul>
</li>
</ul>
<h3 id="logback">Logback</h3>
<ul>
<li><a href="https://blog.csdn.net/rulon147/article/details/52620541">《最全LogBack 详解、含java案例和配置说明》</a></li>
</ul>
<h2 id="orm">ORM</h2>
<ul>
<li><a href="https://blog.csdn.net/sinat_34093604/article/details/53082000">《ORM框架使用优缺点》</a>
<ul>
<li>主要目的是为了提高开发效率。</li>
</ul>
</li>
</ul>
<p><strong>MyBatis：</strong></p>
<ul>
<li>
<p><a href="https://www.cnblogs.com/winclpt/articles/7511672.html">《mybatis缓存机制详解》</a></p>
<ul>
<li>一级缓存是SqlSession级别的缓存，缓存的数据只在SqlSession内有效</li>
<li>二级缓存是mapper级别的缓存，同一个namespace公用这一个缓存，所以对SqlSession是共享的；使用 LRU 机制清理缓存，通过 cacheEnabled 参数开启。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/baidu_32877851/article/details/53959268">《MyBatis学习之代码生成器Generator》</a></p>
</li>
</ul>
<h2 id="网络框架">网络框架</h2>
<p>TODO</p>
<h2 id="web-框架">Web 框架</h2>
<h3 id="spring-家族">Spring 家族</h3>
<p><strong>Spring</strong></p>
<ul>
<li><a href="https://www.w3cschool.cn/wkspring/">Spring 简明教程</a></li>
</ul>
<p><strong>Spring Boot</strong></p>
<ul>
<li><a href="http://projects.spring.io/spring-boot/">官方网站</a></li>
<li><a href="http://blog.didispace.com/Spring-Boot%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/">《Spring Boot基础教程》</a></li>
</ul>
<p><strong>Spring Cloud</strong></p>
<ul>
<li><a href="http://springboot.fun/">Spring Boot 中文索引站</a></li>
<li><a href="https://springcloud.cc/">Spring Cloud 中文文档</a></li>
<li><a href="http://blog.didispace.com/Spring-Cloud%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/">《Spring Cloud基础教程》</a></li>
</ul>
<h2 id="工具框架">工具框架</h2>
<ul>
<li><a href="https://www.cnblogs.com/crazylqy/p/4872236.html">《Apache Commons 工具类介绍及简单使用》</a></li>
<li><a href="http://ifeve.com/google-guava/">《Google guava 中文教程》</a></li>
</ul>
<h1 id="分布式设计">分布式设计</h1>
<h2 id="扩展性设计">扩展性设计</h2>
<ul>
<li>
<p><a href="https://blog.csdn.net/hemin1003/article/details/53633926">《架构师不可不知的十大可扩展架构》</a></p>
<ul>
<li>总结下来，通用的套路就是分布、缓存及异步处理。</li>
</ul>
</li>
<li>
<p><a href="https://yq.aliyun.com/articles/38119">《可扩展性设计之数据切分》</a></p>
<ul>
<li>水平切分+垂直切分</li>
<li>利用中间件进行分片如，MySQL Proxy。</li>
<li>利用分片策略进行切分，如按照ID取模。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/deniro_li/article/details/78458306">《说说如何实现可扩展性的大型网站架构》</a></p>
<ul>
<li>分布式服务+消息队列。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/chaofanwei/article/details/29191073">《大型网站技术架构（七）--网站的可扩展性架构》</a></p>
</li>
</ul>
<h2 id="稳定性-高可用">稳定性 &amp; 高可用</h2>
<ul>
<li>
<p><a href="https://blog.csdn.net/hustspy1990/article/details/78008324">《系统设计：关于高可用系统的一些技术方案》</a></p>
<ul>
<li>可扩展：水平扩展、垂直扩展。 通过冗余部署，避免单点故障。</li>
<li>隔离：避免单一业务占用全部资源。避免业务之间的相互影响 2. 机房隔离避免单点故障。</li>
<li>解耦：降低维护成本，降低耦合风险。减少依赖，减少相互间的影响。</li>
<li>限流：滑动窗口计数法、漏桶算法、令牌桶算法等算法。遇到突发流量时，保证系统稳定。</li>
<li>降级：紧急情况下释放非核心功能的资源。牺牲非核心业务，保证核心业务的高可用。</li>
<li>熔断：异常情况超出阈值进入熔断状态，快速失败。减少不稳定的外部依赖对核心服务的影响。</li>
<li>自动化测试：通过完善的测试，减少发布引起的故障。</li>
<li>灰度发布：灰度发布是速度与安全性作为妥协，能够有效减少发布故障。</li>
</ul>
</li>
<li>
<p><a href="https://coolshell.cn/articles/17459.html">《关于高可用的系统》</a></p>
<ul>
<li>设计原则：数据不丢(持久化)；服务高可用(服务副本)；绝对的100%高可用很难，目标是做到尽可能多的9，如99.999%（全年累计只有5分钟）。</li>
</ul>
</li>
</ul>
<h3 id="硬件负载均衡">硬件负载均衡</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/wuyun-blog/p/6186198.html">《转！！负载均衡器技术Nginx和F5的优缺点对比》</a></p>
<ul>
<li>主要是和F5对比。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/lcword/p/5773296.html">《软/硬件负载均衡产品 你知多少？》</a></p>
</li>
</ul>
<h3 id="软件负载均衡">软件负载均衡</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/tianzhiliang/articles/2317808.html">《几种负载均衡算法》</a><br>
轮寻、权重、负载、最少连接、QoS</p>
</li>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/611-dns-fang-shi.html">《DNS负载均衡》</a></p>
<ul>
<li>配置简单，更新速度慢。</li>
</ul>
</li>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/613-nginx-fu-zai-jun-heng.html">《Nginx负载均衡》</a></p>
<ul>
<li>简单轻量、学习成本低；主要适用于web应用。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/edisonchou/p/4281978.html">《借助LVS+Keepalived实现负载均衡 》</a></p>
<ul>
<li>配置比较负载、只支持到4层，性能较高。</li>
</ul>
</li>
<li>
<p><a href="http://www.ttlsa.com/linux/haproxy-study-tutorial/">《HAProxy用法详解 全网最详细中文文档》</a></p>
<ul>
<li>支持到七层（比如HTTP）、功能比较全面，性能也不错。</li>
</ul>
</li>
<li>
<p><a href="http://blog.itpub.net/25704976/viewspace-1319781/">《Haproxy+Keepalived+MySQL实现读均衡负载》</a></p>
<ul>
<li>主要是用户读请求的负载均衡。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/lylife/p/5584019.html">《rabbitmq+haproxy+keepalived实现高可用集群搭建》</a></p>
</li>
</ul>
<h3 id="限流">限流</h3>
<ul>
<li><a href="https://www.cnblogs.com/haoxinyue/p/6792309.html">《谈谈高并发系统的限流》</a>
<ul>
<li>计数器：通过滑动窗口计数器，控制单位时间内的请求次数，简单粗暴。</li>
<li>漏桶算法：固定容量的漏桶，漏桶满了就丢弃请求，比较常用。</li>
<li>令牌桶算法：固定容量的令牌桶，按照一定速率添加令牌，处理请求前需要拿到令牌，拿不到令牌则丢弃请求，或进入丢队列，可以通过控制添加令牌的速率，来控制整体速度。Guava 中的 RateLimiter 是令牌桶的实现。</li>
<li>Nginx 限流：通过 <code>limit_req</code> 等模块限制并发连接数。</li>
</ul>
</li>
</ul>
<h3 id="应用层容灾">应用层容灾</h3>
<ul>
<li>
<p><a href="https://segmentfault.com/a/1190000005988895">《防雪崩利器：熔断器 Hystrix 的原理与使用》</a></p>
<ul>
<li>雪崩效应原因：硬件故障、硬件故障、程序Bug、重试加大流量、用户大量请求。</li>
<li>雪崩的对策：限流、改进缓存模式(缓存预加载、同步调用改异步)、自动扩容、降级。</li>
<li>Hystrix设计原则：
<ul>
<li>资源隔离：Hystrix通过将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩。</li>
<li>熔断开关：服务的健康状况 = 请求失败数 / 请求总数，通过阈值设定和滑动窗口控制开关。</li>
<li>命令模式：通过继承 HystrixCommand 来包装服务调用逻辑。</li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/zeb_perfect/article/details/54135506">《缓存穿透，缓存击穿，缓存雪崩解决方案分析》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/zeb_perfect/article/details/54135506">《缓存击穿、失效以及热点key问题》</a></p>
<ul>
<li>主要策略：失效瞬间：单机使用锁；使用分布式锁；不过期；</li>
<li>热点数据：热点数据单独存储；使用本地缓存；分成多个子key；</li>
</ul>
</li>
</ul>
<h3 id="跨机房容灾">跨机房容灾</h3>
<ul>
<li>
<p><a href="http://dc.idcquan.com/ywgl/71559.shtml">《“异地多活”多机房部署经验谈》</a></p>
<ul>
<li>通过自研中间件进行数据同步。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/jeffreynicole/article/details/48135093">《异地多活（异地双活）实践经验》</a></p>
<ul>
<li>注意延迟问题，多次跨机房调用会将延时放大数倍。</li>
<li>建房间专线很大概率会出现问题，做好运维和程序层面的容错。</li>
<li>不能依赖于程序端数据双写，要有自动同步方案。</li>
<li>数据永不在高延迟和较差网络质量下，考虑同步质量问题。</li>
<li>核心业务和次要业务分而治之，甚至只考虑核心业务。</li>
<li>异地多活监控部署、测试也要跟上。</li>
<li>业务允许的情况下考虑用户分区，尤其是游戏、邮箱业务。</li>
<li>控制跨机房消息体大小，越小越好。</li>
<li>考虑使用docker容器虚拟化技术，提高动态调度能力。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/yoara/article/details/38013751">容灾技术及建设经验介绍</a></p>
</li>
</ul>
<h3 id="容灾演练流程">容灾演练流程</h3>
<ul>
<li><a href="https://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&amp;mid=2650996320&amp;idx=1&amp;sn=0ed3be190bbee4a9277886ef88cbb2e5">《依赖治理、灰度发布、故障演练，阿里电商故障演练系统的设计与实战经验》</a>
<ul>
<li>常见故障画像</li>
<li>案例：预案有效性、预案有效性、故障复现、架构容灾测试、参数调优、参数调优、故障突袭、联合演练。</li>
</ul>
</li>
</ul>
<h3 id="平滑启动">平滑启动</h3>
<ul>
<li>
<p>平滑重启应用思路<br>
1.端流量（如vip层）、2. flush 数据(如果有)、3, 重启应用</p>
</li>
<li>
<p><a href="https://blog.csdn.net/u011001084/article/details/73480432">《JVM安全退出（如何优雅的关闭java服务）》</a><br>
推荐推出方式：System.exit，Kill SIGTERM；不推荐 kill-9；用 Runtime.addShutdownHook 注册钩子。</p>
</li>
<li>
<p><a href="http://ju.outofmemory.cn/entry/337235">《常见Java应用如何优雅关闭》</a><br>
Java、Srping、Dubbo 优雅关闭方式。</p>
</li>
</ul>
<h2 id="数据库扩展">数据库扩展</h2>
<h3 id="读写分离模式">读写分离模式</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/houdj/p/6563771.html">《Mysql主从方案的实现》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/edisonchou/p/4133148.html">《搭建MySQL主从复制经典架构》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/nimasike/article/details/48048341">《Haproxy+多台MySQL从服务器(Slave) 实现负载均衡》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/zhangsubai/p/6801764.html">《DRBD+Heartbeat+Mysql高可用读写分离架构》</a></p>
<ul>
<li>DRDB 进行磁盘复制，避免单点问题。</li>
</ul>
</li>
<li>
<p><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/62-ke-kuo-zhan-de-shu-ju-ku-jia-gou/621-gao-ke-yong-mysql-de-ji-zhong-fang-an/6214-mysql-cluster-fang-an.html">《MySQL Cluster 方式》</a></p>
</li>
</ul>
<h3 id="分片模式">分片模式</h3>
<ul>
<li>
<p><a href="https://www.jianshu.com/p/32b3e91aa22c">《分库分表需要考虑的问题及方案》</a></p>
<ul>
<li>中间件： 轻量级：sharding-jdbc、TSharding；重量级：Atlas、MyCAT、Vitess等。</li>
<li>问题：事务、Join、迁移、扩容、ID、分页等。</li>
<li>事务补偿：对数据进行对帐检查;基于日志进行比对;定期同标准数据来源进行同步等。</li>
<li>分库策略：数值范围；取模；日期等。</li>
<li>分库数量：通常 MySQL 单库 5千万条、Oracle 单库一亿条需要分库。</li>
</ul>
</li>
<li>
<p><a href="https://www.2cto.com/database/201503/380348.html">《MySql分表和表分区详解》</a></p>
<ul>
<li>分区：是MySQL内部机制，对客户端透明，数据存储在不同文件中，表面上看是同一个表。</li>
<li>分表：物理上创建不同的表、客户端需要管理分表路由。</li>
</ul>
</li>
</ul>
<h2 id="服务治理">服务治理</h2>
<h3 id="服务注册与发现">服务注册与发现</h3>
<ul>
<li>
<p><a href="https://blog.csdn.net/jiaolongdy/article/details/51188798">《永不失联！如何实现微服务架构中的服务发现？》</a></p>
<ul>
<li>客户端服务发现模式：客户端直接查询注册表，同时自己负责负载均衡。Eureka 采用这种方式。</li>
<li>服务器端服务发现模式：客户端通过负载均衡查询服务实例。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/u010963948/article/details/71730165">《SpringCloud服务注册中心比较:Consul vs Zookeeper vs Etcd vs Eureka》</a></p>
<ul>
<li>CAP支持：Consul（CA）、zookeeper（cp）、etcd（cp） 、euerka（ap）</li>
<li>作者认为目前 Consul 对 Spring cloud 的支持比较好。</li>
</ul>
</li>
<li>
<p><a href="http://mobile.51cto.com/news-502394.htm">《基于Zookeeper的服务注册与发现》</a></p>
<ul>
<li>优点：API简单、Pinterest，Airbnb 在用、多语言、通过watcher机制来实现配置PUSH，能快速响应配置变化。</li>
</ul>
</li>
</ul>
<h3 id="服务路由控制">服务路由控制</h3>
<ul>
<li><a href="https://blog.csdn.net/xundh/article/details/59492750">《分布式服务框架学习笔记4 服务路由》</a>
<ul>
<li>原则：透明化路由</li>
<li>负载均衡策略：随机、轮询、服务调用延迟、一致性哈希、粘滞连接</li>
<li>本地路由有限策略：injvm(优先调用jvm内部的服务)，innative(优先使用相同物理机的服务),原则上找距离最近的服务。</li>
<li>配置方式：统一注册表；本地配置；动态下发。</li>
</ul>
</li>
</ul>
<h2 id="分布式一致">分布式一致</h2>
<h3 id="cap-与-base-理论">CAP 与 BASE 理论</h3>
<ul>
<li><a href="http://www.cnblogs.com/szlbm/p/5588543.html">《从分布式一致性谈到CAP理论、BASE理论》</a>
<ul>
<li>一致性分类：强一致(立即一致)；弱一致(可在单位时间内实现一致，比如秒级)；最终一致(弱一致的一种，一定时间内最终一致)</li>
<li>CAP：一致性、可用性、分区容错性(网络故障引起)</li>
<li>BASE：Basically Available（基本可用）、Soft state（软状态）和Eventually consistent（最终一致性）</li>
<li>BASE理论的核心思想是：即使无法做到强一致性，但每个应用都可以根据自身业务特点，采用适当的方式来使系统达到最终一致性。</li>
</ul>
</li>
</ul>
<h3 id="分布式锁">分布式锁</h3>
<ul>
<li>
<p><a href="http://www.hollischuang.com/archives/1716">《分布式锁的几种实现方式》</a></p>
<ul>
<li>基于数据库的分布式锁：优点：操作简单、容易理解。缺点：存在单点问题、数据库性能够开销较大、不可重入；</li>
<li>基于缓存的分布式锁：优点：非阻塞、性能好。缺点：操作不好容易造成锁无法释放的情况。</li>
<li>Zookeeper 分布式锁：通过有序临时节点实现锁机制，自己对应的节点需要最小，则被认为是获得了锁。优点：集群可以透明解决单点问题，避免锁不被释放问题，同时锁可以重入。缺点：性能不如缓存方式，吞吐量会随着zk集群规模变大而下降。</li>
</ul>
</li>
<li>
<p><a href="https://www.tuicool.com/articles/VZJr6fY">《基于Zookeeper的分布式锁》</a></p>
<ul>
<li>清楚的原理描述 + Java 代码示例。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/0201zcr/p/5942748.html">《jedisLock—redis分布式锁实现》</a></p>
<ul>
<li>基于 setnx(set if ont exists)，有则返回false，否则返回true。并支持过期时间。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/albertfly/article/details/77412333">《Memcached 和 Redis 分布式锁方案》</a></p>
<ul>
<li>利用 memcached 的 add（有别于set）操作，当key存在时，返回false。</li>
</ul>
</li>
</ul>
<h3 id="分布式一致性算法">分布式一致性算法</h3>
<h4 id="paxos">PAXOS</h4>
<ul>
<li><a href="https://www.cnblogs.com/linbingdong/p/6253479.html">《分布式系列文章——Paxos算法原理与推导》</a></li>
<li><a href="https://blog.csdn.net/u010039929/article/details/70171672">《Paxos--&gt;Fast Paxos--&gt;Zookeeper分析》</a></li>
<li><a href="https://www.cnblogs.com/leesf456/p/6012777.html">《【分布式】Zookeeper与Paxos》</a></li>
</ul>
<h4 id="zab">Zab</h4>
<ul>
<li><a href="https://www.jianshu.com/p/fb527a64deee">《Zab：Zookeeper 中的分布式一致性协议介绍》</a></li>
</ul>
<h4 id="raft">Raft</h4>
<ul>
<li><a href="http://www.cnblogs.com/mindwind/p/5231986.html">《Raft 为什么是更易理解的分布式一致性算法》</a>
<ul>
<li>三种角色：Leader（领袖）、Follower（群众）、Candidate（候选人）</li>
<li>通过随机等待的方式发出投票，得票多的获胜。</li>
</ul>
</li>
</ul>
<h4 id="gossip">Gossip</h4>
<ul>
<li><a href="http://blog.51cto.com/tianya23/530743">《Gossip算法》</a></li>
</ul>
<h4 id="两阶段提交-多阶段提交">两阶段提交、多阶段提交</h4>
<ul>
<li><a href="http://blog.jobbole.com/95632/">《关于分布式事务、两阶段提交协议、三阶提交协议》</a></li>
</ul>
<h3 id="幂等">幂等</h3>
<ul>
<li><a href="https://www.cnblogs.com/wxgblogs/p/6639272.html">《分布式系统---幂等性设计》</a>
<ul>
<li>幂等特性的作用：该资源具备幂等性，请求方无需担心重复调用会产生错误。</li>
<li>常见保证幂等的手段：MVCC（类似于乐观锁）、去重表(唯一索引)、悲观锁、一次性token、序列号方式。</li>
</ul>
</li>
</ul>
<h3 id="分布式一致方案">分布式一致方案</h3>
<ul>
<li><a href="http://www.infoq.com/cn/articles/solution-of-distributed-system-transaction-consistency">《分布式系统事务一致性解决方案》</a></li>
<li><a href="https://weibo.com/ttarticle/p/show?id=2309403965965003062676">《保证分布式系统数据一致性的6种方案》</a></li>
</ul>
<h3 id="分布式-leader-节点选举">分布式 Leader 节点选举</h3>
<ul>
<li><a href="https://blog.csdn.net/johnson_moon/article/details/78809995">《利用zookeeper实现分布式leader节点选举》</a></li>
</ul>
<h3 id="tcctryconfirmcancel-柔性事务">TCC(Try/Confirm/Cancel) 柔性事务</h3>
<ul>
<li><a href="https://www.jianshu.com/p/ab1a1c6b08a1">《传统事务与柔性事务》</a>
<ul>
<li>基于BASE理论：基本可用、柔性状态、最终一致。</li>
<li>解决方案：记录日志+补偿（正向补充或者回滚）、消息重试(要求程序要幂等)；“无锁设计”、采用乐观锁机制。</li>
</ul>
</li>
</ul>
<h2 id="分布式文件系统">分布式文件系统</h2>
<ul>
<li><a href="https://zhuanlan.zhihu.com/p/27666295">说说分布式文件存储系统-基本架构</a> ？</li>
<li><a href="https://blog.csdn.net/gatieme/article/details/44982961">《各种分布式文件系统的比较》</a> ？
<ul>
<li>HDFS：大批量数据读写，用于高吞吐量的场景，不适合小文件。</li>
<li>FastDFS：轻量级、适合小文件。</li>
</ul>
</li>
</ul>
<h2 id="唯一id-生成">唯一ID 生成</h2>
<h3 id="全局唯一id">全局唯一ID</h3>
<ul>
<li>
<p><a href="https://www.cnblogs.com/baiwa/p/5318432.html">《高并发分布式系统中生成全局唯一Id汇总》</a></p>
<ul>
<li>Twitter 方案（Snowflake 算法）：41位时间戳+10位机器标识（比如IP，服务器名称等）+12位序列号(本地计数器)</li>
<li>Flicker 方案：MySQL自增ID + &quot;REPLACE INTO XXX:SELECT LAST_INSERT_ID();&quot;</li>
<li>UUID：缺点，无序，字符串过长，占用空间，影响检索性能。</li>
<li>MongoDB 方案：利用 ObjectId。缺点：不能自增。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/hdu09075340/article/details/79103851">《TDDL 在分布式下的SEQUENCE原理》</a></p>
<ul>
<li>在数据库中创建 sequence 表，用于记录，当前已被占用的id最大值。</li>
<li>每台客户端主机取一个id区间（比如 1000~2000）缓存在本地，并更新 sequence 表中的id最大值记录。</li>
<li>客户端主机之间取不同的id区间，用完再取，使用乐观锁机制控制并发。</li>
</ul>
</li>
</ul>
<h2 id="一致性hash算法">一致性Hash算法</h2>
<ul>
<li><a href="https://coderxing.gitbooks.io/architecture-evolution/di-san-pian-ff1a-bu-luo/631-yi-zhi-xing-ha-xi.html">《一致性哈希算法》</a></li>
</ul>
<h1 id="设计思想-开发模式">设计思想 &amp; 开发模式</h1>
<h2 id="ddddomain-driven-design-领域驱动设计">DDD(Domain-driven Design - 领域驱动设计)</h2>
<ul>
<li>
<p><a href="https://www.cnblogs.com/netfocus/p/5548025.html">《浅谈我对DDD领域驱动设计的理解》</a></p>
<ul>
<li>概念：DDD 主要对传统软件开发流程(分析-设计-编码)中各阶段的割裂问题而提出，避免由于一开始分析不明或在软件开发过程中的信息流转不一致而造成软件无法交付（和需求方设想不一致）的问题。DDD 强调一切以领域（Domain）为中心，强调领域专家（Domain Expert）的作用，强调先定义好领域模型之后在进行开发，并且领域模型可以指导开发（所谓的驱动）。</li>
<li>过程：理解领域、拆分领域、细化领域，模型的准确性取决于模型的理解深度。</li>
<li>设计：DDD 中提出了建模工具，比如聚合、实体、值对象、工厂、仓储、领域服务、领域事件来帮助领域建模。</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com/butterfly100/p/7827870.html">《领域驱动设计的基础知识总结》</a></p>
<ul>
<li>领域（Doamin）本质上就是问题域，比如一个电商系统，一个论坛系统等。</li>
<li>界限上下文（Bounded Context）：阐述子域之间的关系，可以简单理解成一个子系统或组件模块。</li>
<li>领域模型（Domain Model）：DDD的核心是建立（用通用描述语言、工具—领域通用语言）正确的领域模型；反应业务需求的本质，包括实体和过程；其贯穿软件分析、设计、开发 的整个过程；常用表达领域模型的方式：图、代码或文字；</li>
<li>领域通用语言：领域专家、开发设计人员都能立即的语言或工具。</li>
<li>经典分层架构：用户界面/展示层、应用层、领域层、基础设施层，是四层架构模式。</li>
<li>使用的模式：
<ul>
<li>关联尽量少，尽量单项，尽量降低整体复杂度。</li>
<li>实体（Entity）：领域中的唯一标示，一个实体的属性尽量少，少则清晰。</li>
<li>值对象（Value Object）：没有唯一标识，且属性值不可变，小二简单的对象，比如Date。</li>
<li>领域服务（Domain Service）： 协调多个领域对象，只有方法没有状态(不存数据)；可以分为应用层服务，领域层服务、基础层服务。</li>
<li>聚合及聚合根（Aggregate，Aggregate Root）：聚合定义了一组具有内聚关系的相关对象的集合；聚合根是对聚合引用的唯一元素；当修改一个聚合时，必须在事务级别；大部分领域模型中，有70%的聚合通常只有一个实体，30%只有2~3个实体；如果一个聚合只有一个实体，那么这个实体就是聚合根；如果有多个实体，那么我们可以思考聚合内哪个对象有独立存在的意义并且可以和外部直接进行交互；</li>
<li>工厂（Factory）：类似于设计模式中的工厂模式。</li>
<li>仓储（Repository）：持久化到DB，管理对象，且只对聚合设计仓储。</li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="http://www.cnblogs.com/Leo_wl/p/3866629.html">《领域驱动设计(DDD)实现之路》</a></p>
<ul>
<li>聚合：比如一辆汽车（Car）包含了引擎（Engine）、车轮（Wheel）和油箱（Tank）等组件，缺一不可。</li>
</ul>
</li>
<li>
<p><a href="http://www.hollischuang.com/archives/553">《领域驱动设计系列（2）浅析VO、DTO、DO、PO的概念、区别和用处》</a></p>
</li>
</ul>
<h3 id="命令查询职责分离cqrs">命令查询职责分离(CQRS)</h3>
<p>CQRS — Command Query Responsibility Seperation</p>
<ul>
<li>
<p><a href="https://www.cnblogs.com/cnblogsfans/p/4551990.html">《领域驱动设计系列 (六)：CQRS》</a></p>
<ul>
<li>核心思想：读写分离（查询和更新在不同的方法中），不同的流程只是不同的设计方式，CQ代码分离，分布式环境中会有明显体现（有冗余数据的情况下），目的是为了高性能。</li>
</ul>
</li>
<li>
<p><a href="http://www.techweb.com.cn/network/system/2017-07-07/2553563.shtml">《DDD CQRS架构和传统架构的优缺点比较》</a></p>
<ul>
<li>最终一致的设计理念；依赖于高可用消息中间件。</li>
</ul>
</li>
<li>
<p><a href="http://www.cnblogs.com/netfocus/p/4055346.html">《CQRS架构简介》</a></p>
<ul>
<li>一个实现 CQRS 的抽象案例。</li>
</ul>
</li>
<li>
<p><a href="http://www.uml.org.cn/zjjs/201609221.asp">《深度长文：我对CQRS/EventSourcing架构的思考》</a></p>
<ul>
<li>CQRS 模式分析 + 12306 抢票案例</li>
</ul>
</li>
</ul>
<h3 id="贫血充血模型">贫血，充血模型</h3>
<ul>
<li><a href="https://kb.cnblogs.com/page/520743/">《贫血，充血模型的解释以及一些经验》</a>
<ul>
<li>失血模型：老子和儿子分别定义，相互不知道，二者实体定义中完全没有业务逻辑，通过外部Service进行关联。</li>
<li>贫血模型：老子知道儿子，儿子也知道老子；部分业务逻辑放到实体中；优点：各层单项依赖，结构清楚，易于维护；缺点：不符合OO思想，相比于充血模式，Service层较为厚重；</li>
<li>充血模型：和贫血模型类似，区别在于如何划分业务逻辑。优点：Service层比较薄，只充当Facade的角色，不和DAO打交道、复合OO思想；缺点：非单项依赖，DO和DAO之间双向依赖、和Service层的逻辑划分容易造成混乱。</li>
<li>肿胀模式：是一种极端情况，取消Service层、全部业务逻辑放在DO中；优点：符合OO思想、简化了分层；缺点：暴露信息过多、很多非DO逻辑也会强行并入DO。这种模式应该避免。</li>
<li>作者主张使用贫血模式。</li>
</ul>
</li>
</ul>
<h2 id="actor-模式">Actor 模式</h2>
<p>TODO</p>
<h2 id="响应式编程">响应式编程</h2>
<h3 id="reactor">Reactor</h3>
<p>TODO</p>
<h3 id="rxjava">RxJava</h3>
<p>TODO</p>
<h3 id="vertx">Vert.x</h3>
<p>TODO</p>
<h2 id="dodaf20">DODAF2.0</h2>
<ul>
<li><a href="http://www.360doc.com/content/16/0627/19/33945750_571201779.shtml">《DODAF2.0方法论》</a></li>
<li><a href="http://blog.51cto.com/xiaoyong/1553164">《DODAF2.0之能力视角如何落地》</a></li>
</ul>
<h2 id="serverless">Serverless</h2>
<p>无需过多关系服务器的服务架构理念。</p>
<ul>
<li>
<p><a href="http://www.jdon.com/soa/serverless.html">《什么是Serverless无服务器架构？》</a></p>
<ul>
<li>Serverless 不代表出去服务器，而是去除对服务器运行状态的关心。</li>
<li>Serverless 代表一思维方式的转变，从“构建一套服务在一台服务器上，对对个事件进行响应转变为构建一个为服务器，来响应一个事件”。</li>
<li>Serverless 不代表某个具体的框架。</li>
</ul>
</li>
<li>
<p><a href="http://www.infoq.com/cn/news/2017/10/how-to-understand-serverless">《如何理解Serverless？》</a></p>
<ul>
<li>依赖于 Baas （(Mobile) Backend as a Service） 和 Faas （Functions as a service）</li>
</ul>
</li>
</ul>
<h2 id="service-mesh">Service Mesh</h2>
<ul>
<li>
<p><a href="https://time.geekbang.org/article/2355">《什么是Service Mesh？》</a></p>
</li>
<li>
<p><a href="https://www.jianshu.com/p/e23e3e74538e">《初识 Service Mesh》</a></p>
</li>
<li>
<p><a href="https://time.geekbang.org/article/2355">《什么是Service Mesh？》</a></p>
</li>
</ul>
<h1 id="项目管理">项目管理</h1>
<h2 id="架构评审">架构评审</h2>
<ul>
<li><a href="http://developer.51cto.com/art/201506/478486.htm">《架构设计之如何评审架构设计说明书》</a></li>
<li><a href="https://blog.csdn.net/wireless_com/article/details/45935591">《人人都是架构师：非功能性需求》</a></li>
</ul>
<h2 id="重构">重构</h2>
<ul>
<li><a href="http://www.infoq.com/cn/articles/architect-12-rules-complete/">《架构之重构的12条军规》</a></li>
</ul>
<h2 id="代码规范">代码规范</h2>
<ul>
<li><a href="https://github.com/alibaba/p3c">《阿里巴巴Java开发手册》</a></li>
</ul>
<h2 id="代码-review">代码 Review</h2>
<p>制度还是制度!<br>
另外，每个公司需要根据自己的需求和目标制定自己的 check list</p>
<ul>
<li>
<p><a href="http://www.sohu.com/a/229745352_181657">《为什么你做不好 Code Review？》</a></p>
<ul>
<li>代码 review 做的好，在于制度建设。</li>
</ul>
</li>
<li>
<p><a href="https://blog.csdn.net/uxyheaven/article/details/49773619">《从零开始Code Review》</a></p>
</li>
<li>
<p><a href="https://www.cnblogs.com/zuoping/p/5477047.html">《Code Review Checklist》</a></p>
</li>
<li>
<p><a href="https://dzone.com/articles/java-code-review-checklist">《Java Code Review Checklist》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/legend0011/article/details/45585575">《如何用 gitlab 做 code review》</a></p>
</li>
</ul>
<h2 id="rup">RUP</h2>
<ul>
<li><a href="https://blog.csdn.net/apanious/article/details/51011946">《运用RUP 4+1视图方法进行软件架构设计》</a></li>
</ul>
<h2 id="看板管理">看板管理</h2>
<ul>
<li><a href="https://blog.csdn.net/tkchen/article/details/51637643">《说说看板在项目中的应用》</a></li>
</ul>
<h2 id="scrum">SCRUM</h2>
<p>SCRUM - 争球</p>
<ul>
<li>
<p>3个角色:Product Owner(PO) 产品负责人;Scrum Master（SM），推动Scrum执行;Team 开发团队。</p>
</li>
<li>
<p>3个工件：Product Backlog 产品TODOLIST，含优先级;Sprint Backlog 功能开发 TODO LIST；燃尽图；</p>
</li>
<li>
<p>五个价值观：专注、勇气、公开、承诺、尊重。</p>
</li>
<li>
<p><a href="https://blog.csdn.net/inny100_100/article/details/54633757">《敏捷项目管理流程-Scrum框架最全总结！》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/superkunkun/article/details/52951142">《敏捷其实很简单3---敏捷方法之scrum》</a></p>
</li>
</ul>
<h2 id="敏捷开发">敏捷开发</h2>
<p>TODO</p>
<h2 id="极限编程xp">极限编程（XP）</h2>
<p>XP - eXtreme Programming</p>
<ul>
<li><a href="http://www.woshipm.com/pmd/406917.html">《主流敏捷开发方法：极限编程XP》</a>
<ul>
<li>
<p>是一种指导开发人员的方法论。</p>
</li>
<li>
<p>4大价值：</p>
<ul>
<li>沟通：鼓励口头沟通，提高效率。</li>
<li>简单：够用就好。</li>
<li>反馈：及时反馈、通知相关人。</li>
<li>勇气：提倡拥抱变化，敢于重构。</li>
</ul>
</li>
<li>
<p>5个原则：快速反馈、简单性假设、逐步修改、提倡更改（小步快跑）、优质工作（保证质量的前提下保证小步快跑）。</p>
</li>
<li>
<p>5个工作：阶段性冲刺；冲刺计划会议；每日站立会议；冲刺后review；回顾会议。</p>
</li>
</ul>
</li>
</ul>
<h2 id="结对编程">结对编程</h2>
<p>边写码，边review。能够增强代码质量、减少bug。</p>
<ul>
<li><a href="http://www.baike.com/wiki/%E7%BB%93%E5%AF%B9%E7%BC%96%E7%A8%8B">《结对编程》</a></li>
</ul>
<h2 id="pdca-循环质量管理">PDCA 循环质量管理</h2>
<p>P——PLAN 策划，D——DO 实施，C——CHECK 检查，A——ACT 改进</p>
<ul>
<li><a href="http://www.baike.com/wiki/PDCA">《PDCA》</a></li>
</ul>
<h2 id="fmea管理模式">FMEA管理模式</h2>
<p>TODO</p>
<h1 id="通用业务术语">通用业务术语</h1>
<p>TODO</p>
<h1 id="技术趋势">技术趋势</h1>
<p>TODO</p>
<h1 id="政策-法规">政策、法规</h1>
<p>TODO</p>
<h2 id="法律">法律</h2>
<h3 id="严格遵守刑法253法条">严格遵守刑法253法条</h3>
<p>我国刑法第253条之一规定：</p>
<blockquote>
<ul>
<li>国家机关或者金融、电信、交通、教育、医疗等单位的工作人员，违反国家规定，将本单位在履行职责或者提供服务过程中获得的公民个人信息，出售或者非法提供给他人，情节严重的，处3年以下有期徒刑或者拘役，并处或者单处罚金。</li>
<li>窃取或者以其他方法非法获取上述信息，情节严重的，依照前款的规定处罚。</li>
<li>单位犯前两款罪的，对单位判处罚金，并对其直接负责的主管人员和其他直接责任人员，依照各该款的规定处罚。</li>
</ul>
</blockquote>
<p>最高人民法院、最高人民检察院关于执行《中华人民共和国刑法》确定罪名的补充规定（四）规定：触犯刑法第253条之一第1款之规定，构成“出售、非法提供公民个人信息罪”；触犯刑法第253条之一第2款之规定，构成“非法获取公民个人信息罪”</p>
<ul>
<li><a href="https://baike.baidu.com/item/%E9%9D%9E%E6%B3%95%E8%8E%B7%E5%8F%96%E5%85%AC%E6%B0%91%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF%E7%BD%AA">《非法获取公民个人信息罪》</a></li>
</ul>
<h1 id="架构师素质">架构师素质</h1>
<ul>
<li>
<p><a href="http://hellojava.info/?p=430">《架构师画像》</a></p>
<ul>
<li>业务理解和抽象能力</li>
<li>NB的代码能力</li>
<li>全面：1. 在面对业务问题上，架构师脑海里是否会浮现出多种技术方案；2. 在做系统设计时是否考虑到了足够多的方方面面；3. 在做系统设计时是否考虑到了足够多的方方面面；</li>
<li>全局：是否考虑到了对上下游的系统的影响。</li>
<li>权衡：权衡投入产出比；优先级和节奏控制；</li>
</ul>
</li>
<li>
<p><a href="http://www.infoq.com/cn/articles/architecture-optimization-and-design-the-architect-must-know">《关于架构优化和设计，架构师必须知道的事情》</a></p>
<ul>
<li>要去考虑的细节：模块化、轻耦合、无共享架构；减少各个组件之前的依赖、注意服务之间依赖所有造成的链式失败及影响等。</li>
<li>基础设施、配置、测试、开发、运维综合考虑。</li>
<li>考虑人、团队、和组织的影响。</li>
</ul>
</li>
<li>
<p><a href="https://www.zhihu.com/question/19841397">《如何才能真正的提高自己，成为一名出色的架构师？》</a></p>
</li>
<li>
<p><a href="https://blog.csdn.net/sanbingyutuoniao123/article/details/54144129">《架构师的必备素质和成长途径》</a></p>
<ul>
<li>素质：业务理解、技术广度、技术深度、丰富经验、沟通能力、动手能力、美学素养。</li>
<li>成长路径：2年积累知识、4年积累技能和组内影响力、7年积累部门内影响力、7年以上积累跨部门影响力。</li>
</ul>
</li>
<li>
<p><a href="http://blog.51cto.com/frankfan/1248401">《架构设计师—你在哪层楼？》</a></p>
<ul>
<li>第一层的架构师看到的只是产品本身</li>
<li>第二层的架构师不仅看到自己的产品，还看到了整体的方案</li>
<li>第三层的架构师看到的是商业价值</li>
</ul>
</li>
</ul>
<h1 id="团队管理">团队管理</h1>
<p>TODO</p>
<h2 id="招聘">招聘</h2>
<h1 id="资讯">资讯</h1>
<h2 id="行业资讯">行业资讯</h2>
<ul>
<li><a href="http://36kr.com/">36kr</a></li>
<li><a href="http://www.techweb.com.cn/">Techweb</a></li>
</ul>
<h2 id="公众号列表">公众号列表</h2>
<p>TODO</p>
<h2 id="博客">博客</h2>
<h3 id="团队博客">团队博客</h3>
<ul>
<li><a href="http://jm.taobao.org/">阿里中间件博客</a></li>
<li><a href="https://tech.meituan.com">美团点评技术团队博客</a></li>
</ul>
<h3 id="个人博客">个人博客</h3>
<ul>
<li><a href="http://www.ruanyifeng.com/">阮一峰的网络日志</a></li>
<li><a href="https://coolshell.cn/">酷壳 - COOLSHELL-陈皓</a></li>
<li><a href="http://hellojava.info/">hellojava-阿里毕玄</a></li>
<li><a href="http://cmsblogs.com/">Cm's Blog</a></li>
<li><a href="http://blog.didispace.com/">程序猿DD-翟永超-《Spring Cloud微服务实战》作者</a></li>
</ul>
<h2 id="综合门户-社区">综合门户、社区</h2>
<p><strong>国内：</strong></p>
<ul>
<li>
<p><a href="http://csdn.net">CSDN</a><br>
老牌技术社区、不必解释。</p>
</li>
<li>
<p><a href="http://www.51cto.com/">51cto.com</a></p>
</li>
<li>
<p><a href="http://www.iteye.com/">ITeye</a></p>
<ul>
<li>偏 Java 方向</li>
</ul>
</li>
<li>
<p><a href="https://www.cnblogs.com">博客园</a></p>
</li>
<li>
<p><a href="http://www.tom.net/">ChinaUnix</a></p>
<ul>
<li>偏 Linux 方向</li>
</ul>
</li>
<li>
<p><a href="https://www.oschina.net/">开源中国社区</a></p>
</li>
<li>
<p><a href="http://www.open-open.com/">深度开源</a></p>
</li>
<li>
<p><a href="http://www.jobbole.com/">伯乐在线</a></p>
<ul>
<li>涵盖 IT职场、Web前端、后端、移动端、数据库等方面内容，偏技术端。</li>
</ul>
</li>
<li>
<p><a href="http://www.itpub.net/">ITPUB</a></p>
</li>
<li>
<p><a href="https://cloud.tencent.com/developer/column">腾讯云— 云+社区</a></p>
</li>
<li>
<p><a href="https://yq.aliyun.com/">阿里云— 云栖社区</a></p>
</li>
<li>
<p><a href="https://www.ibm.com/developerworks/cn/">IBM DeveloperWorks</a></p>
</li>
<li>
<p><a href="https://toutiao.io/">开发者头条</a></p>
</li>
<li>
<p><a href="http://www.linkedkeeper.com">LinkedKeeper</a></p>
</li>
</ul>
<p><strong>国外：</strong></p>
<ul>
<li><a href="https://dzone.com">DZone</a></li>
<li><a href="https://www.reddit.com">Reddit</a></li>
</ul>
<h2 id="问答-讨论类社区">问答、讨论类社区</h2>
<ul>
<li><a href="https://segmentfault.com">segmentfault</a>
<ul>
<li>问答+专栏</li>
</ul>
</li>
<li><a href="https://www.zhihu.com/">知乎</a></li>
<li><a href="https://stackoverflow.com/">stackoverflow</a></li>
</ul>
<h2 id="行业数据分析">行业数据分析</h2>
<ul>
<li>
<p><a href="http://report.iresearch.cn/">艾瑞网</a></p>
</li>
<li>
<p><a href="https://www.questmobile.com.cn">QUEST MOBILE</a></p>
</li>
<li>
<p><a href="http://data.stats.gov.cn/">国家数据</a></p>
</li>
<li>
<p><a href="http://www.talkingdata.com/">TalkingData</a></p>
</li>
</ul>
<h2 id="专项网站">专项网站</h2>
<ul>
<li>
<p>测试:</p>
<ul>
<li><a href="http://www.ltesting.net/">领测国际</a></li>
<li><a href="https://www.testwo.com/">测试窝</a></li>
<li><a href="https://testerhome.com">TesterHome</a></li>
</ul>
</li>
<li>
<p>运维:</p>
<ul>
<li><a href="http://www.yunweipai.com/">运维派</a></li>
<li><a href="https://www.abcdocker.com/">Abcdocker</a></li>
</ul>
</li>
<li>
<p>Java:</p>
<ul>
<li><a href="http://www.importnew.com/">ImportNew</a>
<ul>
<li>专注于 Java 技术分享</li>
</ul>
</li>
<li><a href="https://howtodoinjava.com/">HowToDoInJava</a>
<ul>
<li>英文博客</li>
</ul>
</li>
</ul>
</li>
<li>
<p>安全</p>
<ul>
<li><a href="https://www.2cto.com/">红黑联盟</a></li>
<li><a href="http://www.freebuf.com/">FreeBuf</a></li>
</ul>
</li>
<li>
<p>大数据</p>
<ul>
<li><a href="http://www.thebigdata.cn/">中国大数据</a></li>
</ul>
</li>
<li>
<p>其他专题网站：</p>
<ul>
<li><a href="http://www.dockerinfo.net/">DockerInfo</a>
<ul>
<li>专注于 Docker 应用及咨询、教程的网站。</li>
</ul>
</li>
<li><a href="https://www.linuxidc.com/">Linux公社</a>
<ul>
<li>Linux 主题社区</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="其他类">其他类</h2>
<ul>
<li><a href="https://github.com/TeamStuQ/skill-map">程序员技能图谱</a></li>
</ul>
<h2 id="推荐参考书">推荐参考书</h2>
<h3 id="在线电子书">在线电子书</h3>
<ul>
<li>
<p><a href="https://github.com/forezp/SpringCloudLearning">《深入理解Spring Cloud与微服务构建》</a></p>
</li>
<li>
<p><a href="http://techforum-img.cn-hangzhou.oss-pub.aliyun-inc.com/1523849261680/AliTech101_RD.pdf">《阿里技术参考图册-研发篇》</a></p>
</li>
<li>
<p><a href="http://techforum-img.cn-hangzhou.oss-pub.aliyun-inc.com/1523848064814/AliTech101_Algorithms.pdf">《阿里技术参考图册-算法篇》</a></p>
</li>
<li>
<p><a href="http://dpurl.cn/n/1lqcX">《2018美团点评技术年货（合辑）》70M</a></p>
</li>
<li>
<p><a href="http://www.infoq.com/cn/architect/">InfoQ《架构师》月刊</a></p>
</li>
<li>
<p><a href="https://www.w3cschool.cn/architectroad/">《架构师之路》</a></p>
</li>
</ul>
<h3 id="纸质书">纸质书</h3>
<h4 id="开发方面">开发方面</h4>
<ul>
<li>《阿里巴巴Java开发手册》<a href="https://union-click.jd.com/jdc?d=bVKwZQ">京东</a> <a href="https://s.taobao.com/search?q=%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C">淘宝</a></li>
</ul>
<h4 id="架构方面">架构方面</h4>
<ul>
<li>
<p>《软件架构师的12项修炼：技术技能篇》<a href="https://union-click.jd.com/jdc?d=gXvRd8">京东</a> <a href="https://s.taobao.com/search?q=%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84%E5%B8%88%E7%9A%8412%E9%A1%B9%E4%BF%AE%E7%82%BC%EF%BC%9A%E6%8A%80%E6%9C%AF%E6%8A%80%E8%83%BD%E7%AF%87">淘宝</a></p>
</li>
<li>
<p>《架构之美》<a href="https://union-click.jd.com/jdc?d=xJit5I">京东</a> <a href="https://s.taobao.com/search?q=%E6%9E%B6%E6%9E%84%E4%B9%8B%E7%BE%8E">淘宝</a></p>
</li>
<li>
<p>《分布式服务架构》<a href="https://union-click.jd.com/jdc?d=JS5Od9">京东</a> <a href="https://s.taobao.com/search?q=%E5%88%86%E5%B8%83%E5%BC%8F%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84">淘宝</a></p>
</li>
<li>
<p>《聊聊架构》 <a href="https://union-click.jd.com/jdc?d=FHooH4">京东</a> <a href="https://s.taobao.com/search?q=%E8%81%8A%E8%81%8A%E6%9E%B6%E6%9E%84">淘宝</a></p>
</li>
<li>
<p>《云原生应用架构实践》<a href="https://union-click.jd.com/jdc?d=orkJSj">京东</a> <a href="https://s.taobao.com/search?q=%E4%BA%91%E5%8E%9F%E7%94%9F%E5%BA%94%E7%94%A8%E6%9E%B6%E6%9E%84%E5%AE%9E%E8%B7%B5">淘宝</a></p>
</li>
<li>
<p>《亿级流量网站架构核心技术》<a href="https://union-click.jd.com/jdc?d=RnOSP5">京东</a> <a href="https://s.taobao.com/search?q=%E4%BA%BF%E7%BA%A7%E6%B5%81%E9%87%8F%E7%BD%91%E7%AB%99%E6%9E%B6%E6%9E%84%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF">淘宝</a></p>
</li>
<li>
<p>《淘宝技术这十年》<a href="https://union-click.jd.com/jdc?d=LwrDfD">京东</a> <a href="https://s.taobao.com/search?q=%E6%B7%98%E5%AE%9D%E6%8A%80%E6%9C%AF%E8%BF%99%E5%8D%81%E5%B9%B4">淘宝</a></p>
</li>
<li>
<p>《企业IT架构转型之道-中台战略思想与架构实战》 <a href="https://union-click.jd.com/jdc?d=89pAEm">京东</a> <a href="https://s.taobao.com/search?q=%E4%BC%81%E4%B8%9AIT%E6%9E%B6%E6%9E%84%E8%BD%AC%E5%9E%8B%E4%B9%8B%E9%81%93">淘宝</a></p>
</li>
<li>
<p>《高可用架构（第1卷）》<a href="https://item.jd.com/12195481.html">京东</a> <a href="https://s.taobao.com/search?q=%E9%AB%98%E5%8F%AF%E7%94%A8%E6%9E%B6%E6%9E%84">淘宝</a></p>
</li>
</ul>
<h4 id="技术管理方面">技术管理方面</h4>
<ul>
<li>《CTO说》<a href="https://union-click.jd.com/jdc?d=zhTZyr">京东</a> <a href="https://s.taobao.com/search?q=CTO%E8%AF%B4">淘宝</a></li>
<li>《技术管理之巅》<a href="https://union-click.jd.com/jdc?d=LgRBUW">京东</a> <a href="https://s.taobao.com/search?q=%E6%8A%80%E6%9C%AF%E7%AE%A1%E7%90%86%E4%B9%8B%E5%B7%85">淘宝</a></li>
<li>《网易一千零一夜：互联网产品项目管理实战》<a href="https://union-click.jd.com/jdc?d=jcRz2r">京东</a> <a href="https://s.taobao.com/search?q=%E7%BD%91%E6%98%93%E4%B8%80%E5%8D%83%E9%9B%B6%E4%B8%80%E5%A4%9C%EF%BC%9A%E4%BA%92%E8%81%94%E7%BD%91%E4%BA%A7%E5%93%81%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86%E5%AE%9E%E6%88%98">淘宝</a></li>
</ul>
<h4 id="基础理论-2">基础理论</h4>
<ul>
<li>《数学之美》<a href="https://union-click.jd.com/jdc?d=ghIES2">京东</a> <a href="https://s.taobao.com/search?q=%E6%95%B0%E5%AD%A6%E4%B9%8B%E7%BE%8E">淘宝</a></li>
<li>《编程珠玑》<a href="https://union-click.jd.com/jdc?d=YmhdEu">京东</a> <a href="https://s.taobao.com/search?q=%E7%BC%96%E7%A8%8B%E7%8F%A0%E7%8E%91">淘宝</a></li>
</ul>
<h4 id="工具方面">工具方面</h4>
<p>TODO</p>
<h4 id="大数据方面">大数据方面</h4>
<h1 id="技术资源">技术资源</h1>
<h2 id="开源资源">开源资源</h2>
<ul>
<li>
<p><a href="https://github.com">github</a></p>
</li>
<li>
<p><a href="https://www.apache.org/index.html">Apache 软件基金会</a></p>
</li>
</ul>
<h2 id="手册-文档-教程">手册、文档、教程</h2>
<p><strong>国内：</strong></p>
<ul>
<li>
<p><a href="http://w3cschool.cn">W3Cschool</a></p>
</li>
<li>
<p><a href="http://www.runoob.com/">Runoob.com</a></p>
<ul>
<li>HTML 、 CSS、XML、Java、Python、PHP、设计模式等入门手册。</li>
</ul>
</li>
<li>
<p><a href="https://love2.io/">Love2.io</a></p>
<ul>
<li>很多很多中文在线电子书，是一个全新的开源技术文档分享平台。</li>
</ul>
</li>
<li>
<p><a href="http://gitbook.cn/">gitbook.cn</a></p>
<ul>
<li>付费电子书。</li>
</ul>
</li>
<li>
<p><a href="http://www.apachecn.org/">ApacheCN</a></p>
<ul>
<li>AI、大数据方面系列中文文档。</li>
</ul>
</li>
</ul>
<p><strong>国外：</strong></p>
<ul>
<li><a href="http://www.quickcode.co/">Quick Code</a>
<ul>
<li>免费在线技术教程。</li>
</ul>
</li>
<li><a href="http://gitbook.com">gitbook.com</a>
<ul>
<li>有部分中文电子书。</li>
</ul>
</li>
<li><a href="https://www.cheatography.com/">Cheatography</a>
<ul>
<li>Cheat Sheets 大全，单页文档网站。</li>
</ul>
</li>
<li><a href="https://www.tutorialspoint.com/index.htm">Tutorialspoint</a>
<ul>
<li>知名教程网站，提供Java、Python、JS、SQL、大数据等高质量入门教程。</li>
</ul>
</li>
</ul>
<h2 id="在线课堂">在线课堂</h2>
<ul>
<li><a href="http://www.xuetuwuyou.com/">学徒无忧</a></li>
<li><a href="https://time.geekbang.org/">极客时间</a></li>
<li><a href="https://segmentfault.com/lives">segmentfault</a></li>
<li><a href="https://new.stuq.org/course/explore">斯达克学院</a></li>
<li><a href="http://nowcoder.com">牛客网</a></li>
<li><a href="https://www.jikexueyuan.com/">极客学院</a></li>
<li><a href="http://edu.51cto.com/">51CTO学院</a></li>
</ul>
<h2 id="会议-活动">会议、活动</h2>
<ul>
<li><a href="http://www.infoq.com/cn/qcon/">QCon</a></li>
<li><a href="https://archsummit.com">ArchSummit</a></li>
<li><a href="http://www.thegitc.com/">GITC全球互联网技术大会</a></li>
</ul>
<p><strong>活动发布平台:</strong></p>
<ul>
<li><a href="http://www.huodongxing.com/">活动行</a></li>
</ul>
<h2 id="常用app">常用APP</h2>
<ul>
<li><a href="https://time.geekbang.org">极客时间</a></li>
<li><a href="https://www.igetget.com">得到</a></li>
</ul>
<h2 id="找工作">找工作</h2>
<ul>
<li><a href="https://www.zhipin.com">Boss直聘</a></li>
<li><a href="https://www.lagou.com">拉勾网</a></li>
<li><a href="https://www.liepin.com">猎聘</a></li>
<li><a href="https://cn.100offer.com/">100Offer</a></li>
</ul>
<h2 id="工具">工具</h2>
<ul>
<li><a href="https://s.geekbang.org/">极客搜索</a>
<ul>
<li>技术文章搜索引擎。</li>
</ul>
</li>
</ul>
<h2 id="代码托管">代码托管</h2>
<ul>
<li><a href="https://coding.net">Coding</a></li>
<li><a href="https://gitee.com/">码云</a></li>
</ul>
<h2 id="文件服务">文件服务</h2>
<ul>
<li>七牛</li>
<li>又拍云</li>
</ul>
<h2 id="综合云服务商">综合云服务商</h2>
<ul>
<li>阿里云</li>
<li><a href="https://cloud.tencent.com/redirect.php?redirect=1012&amp;cps_key=c2665015d90871c0cb20fef91b7afc3c">腾讯云</a></li>
<li>百度云</li>
<li>新浪云</li>
<li>金山云</li>
<li><a href="https://amazonaws-china.com/cn/">亚马逊云(AWS)</a></li>
<li><a href="https://cloud.google.com/?hl=zh-cn">谷歌云</a></li>
<li><a href="https://azure.microsoft.com/zh-cn/">微软云</a></li>
</ul>
<h3 id="vps">VPS</h3>
<ul>
<li><a href="http://linode.com">Linode</a></li>
</ul>

            </div>
            
            
              <div class="post-footer">
  <ul class="post-copyright">
    <li class="post-copyright-author">
      <strong class="language" data-lan="author">本文作者：</strong>
      anhoder
    </li>
    <li class="post-copyright-link">
      <strong class="language" data-lan="link">本文链接：</strong>
      <a href="/post/N2amIMO_J/" title="后端架构师技术图谱【转】">/post/N2amIMO_J/</a>
    </li>
    <li class="post-copyright-license">
      <strong class="language" data-lan="copyright">版权声明： </strong>
      本博客所有文章除特别声明外，均采用<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="noopener" target="_blank"><i class="fa fa-fw fa-creative-commons"></i> BY-NC-SA</a> 许可协议。转载请注明出处！
    </li>
  </ul>
  <div class="tags">
    
      <a href="/tag/wKIDH6M-M/"># PHP</a>
    
  </div>
  <div class="nav">
    <div class="nav-prev">
      
        <i class="fa fa-chevron-left"></i>
        <a class="nav-pc-next" title="PHP的浅复制和深复制" href="/post/l9oHb1QpJ/">PHP的浅复制和深复制</a class="nav-pc-next">
        <a class="nav-mobile-prev" title="PHP的浅复制和深复制" href="/post/l9oHb1QpJ/">上一篇</a>
      
    </div>
    <div class="nav-next">
      
        <a class="nav-pc-next" title="Redis内存数据库基本操作" href="/post/D3HpyGEvB/">Redis内存数据库基本操作</a>
        <a class="nav-mobile-next" title="Redis内存数据库基本操作" href="/post/D3HpyGEvB/">下一篇</a>
        <i class="fa fa-chevron-right"></i>
      
    </div>
  </div>
</div>
            
            
  
    
      <link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css">
<script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script>

<div id="gitalk-container"></div>

<script>
  var gitalk = new Gitalk({
    clientID: '8254f894b17fffeef6e2',
    clientSecret: 'aa345603999774a44649ad73ef7fe72ee45a021b',
    repo: 'personal-blog-comments',
    owner: 'anhoder',
    admin: ['anhoder'],
    id: (location.pathname).substring(0, 49),      // Ensure uniqueness and length less than 50
    distractionFreeMode: false  // Facebook-like distraction free mode
  })
  gitalk.render('gitalk-container')
</script>
    
    
  

          </div>
        </div>
      </div>
    </div>
    <div class="footer-box">
  <footer class="footer">
    <div class="poweredby">
      © Authored by <a href="https://github.com/anhoder">anhoder</a> since 2019.
    </div>
    <div class="copyright">
      Powered by <a href="https://github.com/getgridea/gridea" target="_blank">Gridea</a> | Theme By <a
        href="https://github.com/hsxyhao/gridea-theme-next" target="_blank">HsxyHao</a>
    </div>
  </footer>
  
  
  <div class="pisces back-to-top" id="back_to_top">
    <i class="fa fa-arrow-up"></i>
    
    <span class="scrollpercent">
      <span id="back_to_top_text">0</span>%
    </span>
    
  </div>
  
  
  
<link rel="stylesheet" href="/media/live2d/css/live2d.css" />
<div class="box-scale">
  <div id="landlord" style="left: 100%px;bottom: 100%px;"
    data-key="">
    <canvas id="live2d" width="500" height="560" class="live2d"></canvas>
    
  </div>
</div>
<div id="open_live2d">召唤看板娘</div>
<script src="https://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>
  var message_Path = 'https://cdn.jsdelivr.net/gh/anhoder/source-for-blog@master/';
  let landlord = document.querySelector('#landlord');
  var apiKey = landlord.dataset.key;
</script>
<script type="text/javascript" src="/media/live2d/js/live2d.js"></script>
<script>
	var home_Path = document.location.protocol + '//' + window.document.location.hostname + ":" + window.document.location.port + '/';
	var userAgent = window.navigator.userAgent.toLowerCase();
	var norunAI = ["android", "iphone", "ipod", "ipad", "windows phone", "mqqbrowser", "msie", "trident/7.0"];
	var norunFlag = false;

	for (var i = 0; i < norunAI.length; i++) {
		if (userAgent.indexOf(norunAI[i]) > -1) {
			norunFlag = true;
			break;
		}
	}

	if (!window.WebGLRenderingContext) {
		norunFlag = true;
	}

	if (!norunFlag) {
		var hitFlag = false;
		var AIFadeFlag = false;
		var liveTlakTimer = null;
		var sleepTimer_ = null;
		var AITalkFlag = false;
		var talkNum = 0;
		(function () {
			function renderTip(template, context) {
				var tokenReg = /(\\)?\{([^\{\}\\]+)(\\)?\}/g;
				return template.replace(tokenReg, function (word, slash1, token, slash2) {
					if (slash1 || slash2) {
						return word.replace('\\', '');
					}
					var variables = token.replace(/\s/g, '').split('.');
					var currentObject = context;
					var i, length, variable;
					for (i = 0, length = variables.length; i < length; ++i) {
						variable = variables[i];
						currentObject = currentObject[variable];
						if (currentObject === undefined || currentObject === null) return '';
					}
					return currentObject;
				});
			}

			String.prototype.renderTip = function (context) {
				return renderTip(this, context);
			};

			var re = /x/;
			re.toString = function () {
				showMessage('哈哈，你打开了控制台，是想要看看我的秘密吗？', 5000);
				return '';
			};

			$(document).on('copy', function () {
				showMessage('你都复制了些什么呀，转载要记得加上出处哦~~', 5000);
			});

			function initTips() {
				$.ajax({
					cache: true,
					url: message_Path + 'message.json',
					dataType: "json",
					success: function (result) {
						$.each(result.mouseover, function (index, tips) {
							$(tips.selector).mouseover(function () {
								var text = tips.text;
								if (Array.isArray(tips.text)) text = tips.text[Math.floor(Math.random() * tips.text.length + 1) - 1];
								text = text.renderTip({ text: $(this).text() });
								showMessage(text, 3000);
								talkValTimer();
								clearInterval(liveTlakTimer);
								liveTlakTimer = null;
							});
							$(tips.selector).mouseout(function () {
								showHitokoto();
								if (liveTlakTimer == null) {
									liveTlakTimer = window.setInterval(function () {
										showHitokoto();
									}, 15000);
								};
							});
						});
						$.each(result.click, function (index, tips) {
							$(tips.selector).click(function () {
								if (hitFlag) {
									return false
								}
								hitFlag = true;
								setTimeout(function () {
									hitFlag = false;
								}, 8000);
								var text = tips.text;
								if (Array.isArray(tips.text)) text = tips.text[Math.floor(Math.random() * tips.text.length + 1) - 1];
								text = text.renderTip({ text: $(this).text() });
								showMessage(text, 3000);
							});
							clearInterval(liveTlakTimer);
							liveTlakTimer = null;
							if (liveTlakTimer == null) {
								liveTlakTimer = window.setInterval(function () {
									showHitokoto();
								}, 15000);
							};
						});
					}
				});
			}
			initTips();

			var text;
			if (document.referrer !== '') {
				var referrer = document.createElement('a');
				referrer.href = document.referrer;
				text = '嗨！来自 <span style="color:#0099cc;">' + referrer.hostname + '</span> 的朋友！';
				var domain = referrer.hostname.split('.')[1];
				if (domain == 'baidu') {
					text = '嗨！ 来自 百度搜索 的朋友！<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' - ')[0] + ' 」</span>';
				} else if (domain == 'so') {
					text = '嗨！ 来自 360搜索 的朋友！<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' - ')[0] + ' 」</span>';
				} else if (domain == 'google') {
					text = '嗨！ 来自 谷歌搜索 的朋友！<br>欢迎访问<span style="color:#0099cc;">「 ' + document.title.split(' - ')[0] + ' 」</span>';
				}
			} else {
				if (window.location.href == home_Path) { //主页URL判断，需要斜杠结尾
					var now = (new Date()).getHours();
					if (now > 23 || now <= 5) {
						text = '你是夜猫子呀？这么晚还不睡觉，明天起的来嘛？';
					} else if (now > 5 && now <= 7) {
						text = '早上好！一日之计在于晨，美好的一天就要开始了！';
					} else if (now > 7 && now <= 11) {
						text = '上午好！工作顺利嘛，不要久坐，多起来走动走动哦！';
					} else if (now > 11 && now <= 14) {
						text = '中午了，工作了一个上午，现在是午餐时间！';
					} else if (now > 14 && now <= 17) {
						text = '午后很容易犯困呢，今天的运动目标完成了吗？';
					} else if (now > 17 && now <= 19) {
						text = '傍晚了！窗外夕阳的景色很美丽呢，最美不过夕阳红~~';
					} else if (now > 19 && now <= 21) {
						text = '晚上好，今天过得怎么样？';
					} else if (now > 21 && now <= 23) {
						text = '已经这么晚了呀，早点休息吧，晚安~~';
					} else {
						text = '嗨~ 快来逗我玩吧！';
					}
				} else {
					text = '欢迎阅读<span style="color:#0099cc;">「 ' + document.title.split(' - ')[0] + ' 」</span>';
				}
			}
			showMessage(text, 12000);
		})();

		liveTlakTimer = setInterval(function () {
			showHitokoto();
		}, 15000);

		function showHitokoto() {
			if (sessionStorage.getItem("Sleepy") !== "1") {
				if (!AITalkFlag) {
					$.getJSON('https://v1.hitokoto.cn/', function (result) {
						talkValTimer();
						showMessage(result.hitokoto, 0);
					});
				}
			} else {
				hideMessage(0);
				if (sleepTimer_ == null) {
					sleepTimer_ = setInterval(function () {
						checkSleep();
					}, 200);
				}
			}
		}

		function checkSleep() {
			var sleepStatu = sessionStorage.getItem("Sleepy");
			if (sleepStatu !== '1') {
				talkValTimer();
				showMessage('你回来啦~', 0);
				clearInterval(sleepTimer_);
				sleepTimer_ = null;
			}
		}

		function showMessage(text, timeout) {
			if (Array.isArray(text)) text = text[Math.floor(Math.random() * text.length + 1) - 1];
			$('.message').stop();
			$('.message').html(text);
			$('.message').fadeTo(200, 1);
			//if (timeout === null) timeout = 5000;
			//hideMessage(timeout);
		}
		function talkValTimer() {
			$('#live_talk').val('1');
		}

		function hideMessage(timeout) {
			//$('.message').stop().css('opacity',1);
			if (timeout === null) timeout = 5000;
			$('.message').delay(timeout).fadeTo(200, 0);
		}

		function initLive2d() {
			$('#hideButton').on('click', function () {
				if (AIFadeFlag) {
					return false;
				} else {
					AIFadeFlag = true;
					localStorage.setItem("live2dhidden", "0");
					$('#landlord').fadeOut(200);
					$('#open_live2d').delay(200).fadeIn(200);
					setTimeout(function () {
						AIFadeFlag = false;
					}, 300);
				}
			});
			$('#open_live2d').on('click', function () {
				if (AIFadeFlag) {
					return false;
				} else {
					AIFadeFlag = true;
					localStorage.setItem("live2dhidden", "1");
					$('#open_live2d').fadeOut(200);
					$('#landlord').delay(200).fadeIn(200);
					setTimeout(function () {
						AIFadeFlag = false;
					}, 300);
				}
			});
			$('#youduButton').on('click', function () {
				if ($('#youduButton').hasClass('doudong')) {
					var typeIs = $('#youduButton').attr('data-type');
					$('#youduButton').removeClass('doudong');
					$('body').removeClass(typeIs);
					$('#youduButton').attr('data-type', '');
				} else {
					var duType = $('#duType').val();
					var duArr = duType.split(",");
					var dataType = duArr[Math.floor(Math.random() * duArr.length)];

					$('#youduButton').addClass('doudong');
					$('#youduButton').attr('data-type', dataType);
					$('body').addClass(dataType);
				}
			});
			if (apiKey) {
				$('#showInfoBtn').on('click', function () {
					var live_statu = $('#live_statu_val').val();
					if (live_statu == "0") {
						return
					} else {
						$('#live_statu_val').val("0");
						$('.live_talk_input_body').fadeOut(500);
						AITalkFlag = false;
						showHitokoto();
						$('#showTalkBtn').show();
						$('#showInfoBtn').hide();
					}
				});
				$('#showTalkBtn').on('click', function () {
					var live_statu = $('#live_statu_val').val();
					if (live_statu == "1") {
						return
					} else {
						$('#live_statu_val').val("1");
						$('.live_talk_input_body').fadeIn(500);
						AITalkFlag = true;
						$('#showTalkBtn').hide();
						$('#showInfoBtn').show();

					}
				});
				$('#talk_send').on('click', function () {
					var info_ = $('#AIuserText').val();
					var userid_ = $('#AIuserName').val();
					if (info_ == "") {
						showMessage('写点什么吧！', 0);
						return;
					}
					if (userid_ == "") {
						showMessage('聊之前请告诉我你的名字吧！', 0);
						return;
					}
					showMessage('思考中~', 0);
					let protocol = window.location.protocol.indexOf("s") > 0 ? "https" : "http";
					$.ajax({
						type: "get",
						url: `${protocol}://www.tuling123.com/openapi/api?key=${apiKey}&info=${info_}`,
						dataType: "json",
						success: function (res) {
							talkValTimer();
							showMessage(res.text, 0);
							$('#AIuserText').val("");
							sessionStorage.setItem("live2duser", userid_);
						},
						error: function (e) {
							talkValTimer();
							showMessage('似乎有什么错误，请和站长联系！', 0);
						}
					});
				});
			} else {
				$('#showInfoBtn').hide();
				$('#showTalkBtn').hide();
			}
			//获取音乐信息初始化
			var bgmListInfo = $('input[name=live2dBGM]');
			if (bgmListInfo.length == 0) {
				$('#musicButton').hide();
			} else {
				var bgmPlayNow = parseInt($('#live2d_bgm').attr('data-bgm'));
				var bgmPlayTime = 0;
				var live2dBGM_Num = sessionStorage.getItem("live2dBGM_Num");
				var live2dBGM_PlayTime = sessionStorage.getItem("live2dBGM_PlayTime");
				if (live2dBGM_Num) {
					if (live2dBGM_Num <= $('input[name=live2dBGM]').length - 1) {
						bgmPlayNow = parseInt(live2dBGM_Num);
					}
				}
				if (live2dBGM_PlayTime) {
					bgmPlayTime = parseInt(live2dBGM_PlayTime);
				}
				var live2dBGMSrc = bgmListInfo.eq(bgmPlayNow).val();
				$('#live2d_bgm').attr('data-bgm', bgmPlayNow);
				$('#live2d_bgm').attr('src', live2dBGMSrc);
				$('#live2d_bgm')[0].currentTime = bgmPlayTime;
				$('#live2d_bgm')[0].volume = 0.5;
				var live2dBGM_IsPlay = sessionStorage.getItem("live2dBGM_IsPlay");
				var live2dBGM_WindowClose = sessionStorage.getItem("live2dBGM_WindowClose");
				if (live2dBGM_IsPlay == '0' && live2dBGM_WindowClose == '0') {
					$('#live2d_bgm')[0].play();
					$('#musicButton').addClass('play');
				}
				sessionStorage.setItem("live2dBGM_WindowClose", '1');
				$('#musicButton').on('click', function () {
					if ($('#musicButton').hasClass('play')) {
						$('#live2d_bgm')[0].pause();
						$('#musicButton').removeClass('play');
						sessionStorage.setItem("live2dBGM_IsPlay", '1');
					} else {
						$('#live2d_bgm')[0].play();
						$('#musicButton').addClass('play');
						sessionStorage.setItem("live2dBGM_IsPlay", '0');
					}
				});
				window.onbeforeunload = function () {
					sessionStorage.setItem("live2dBGM_WindowClose", '0');
					if ($('#musicButton').hasClass('play')) {
						sessionStorage.setItem("live2dBGM_IsPlay", '0');
					}
				}
				document.getElementById('live2d_bgm').addEventListener("timeupdate", function () {
					var live2dBgmPlayTimeNow = document.getElementById('live2d_bgm').currentTime;
					sessionStorage.setItem("live2dBGM_PlayTime", live2dBgmPlayTimeNow);
				});
				document.getElementById('live2d_bgm').addEventListener("ended", function () {
					var listNow = parseInt($('#live2d_bgm').attr('data-bgm'));
					listNow++;
					if (listNow > $('input[name=live2dBGM]').length - 1) {
						listNow = 0;
					}
					var listNewSrc = $('input[name=live2dBGM]').eq(listNow).val();
					sessionStorage.setItem("live2dBGM_Num", listNow);
					$('#live2d_bgm').attr('src', listNewSrc);
					$('#live2d_bgm')[0].play();
					$('#live2d_bgm').attr('data-bgm', listNow);
				});
				document.getElementById('live2d_bgm').addEventListener("error", function () {
					$('#live2d_bgm')[0].pause();
					$('#musicButton').removeClass('play');
					showMessage('音乐似乎加载不出来了呢！', 0);
				});
			}
			//获取用户名
			var live2dUser = sessionStorage.getItem("live2duser");
			if (live2dUser !== null) {
				$('#AIuserName').val(live2dUser);
			}
			//获取位置
			var landL = sessionStorage.getItem("historywidth");
			var landB = sessionStorage.getItem("historyheight");
			if (landL == null || landB == null) {
				landL = '5px'
				landB = '0px'
			}
			$('#landlord').css('left', landL + 'px');
			$('#landlord').css('bottom', landB + 'px');
			//移动
			function getEvent() {
				return window.event || arguments.callee.caller.arguments[0];
			}
			var smcc = document.getElementById("landlord");
			var moveX = 0;
			var moveY = 0;
			var moveBottom = 0;
			var moveLeft = 0;
			var moveable = false;
			var docMouseMoveEvent = document.onmousemove;
			var docMouseUpEvent = document.onmouseup;
			smcc.onmousedown = function () {
				var ent = getEvent();
				moveable = true;
				moveX = ent.clientX;
				moveY = ent.clientY;
				var obj = smcc;
				moveBottom = parseInt(obj.style.bottom);
				moveLeft = parseInt(obj.style.left);
				if (isFirefox = navigator.userAgent.indexOf("Firefox") > 0) {
					window.getSelection().removeAllRanges();
				}
				document.onmousemove = function () {
					if (moveable) {
						var ent = getEvent();
						var x = moveLeft + ent.clientX - moveX;
						var y = moveBottom + (moveY - ent.clientY);
						obj.style.left = x + "px";
						obj.style.bottom = y + "px";
					}
				};
				document.onmouseup = function () {
					if (moveable) {
						var historywidth = obj.style.left;
						var historyheight = obj.style.bottom;
						historywidth = historywidth.replace('px', '');
						historyheight = historyheight.replace('px', '');
						sessionStorage.setItem("historywidth", historywidth);
						sessionStorage.setItem("historyheight", historyheight);
						document.onmousemove = docMouseMoveEvent;
						document.onmouseup = docMouseUpEvent;
						moveable = false;
						moveX = 0;
						moveY = 0;
						moveBottom = 0;
						moveLeft = 0;
					}
				};
			};
		}
		$(document).ready(function () {
			var AIimgSrc = [];
			let chooseLive2d = 'plt'
			if (chooseLive2d === 'histoire') {
				AIimgSrc.push(message_Path + "model/histoire/histoire.1024/texture_00.png");
				AIimgSrc.push(message_Path + "model/histoire/histoire.1024/texture_01.png");
				AIimgSrc.push(message_Path + "model/histoire/histoire.1024/texture_02.png");
				AIimgSrc.push(message_Path + "model/histoire/histoire.1024/texture_03.png");
			} else if (chooseLive2d === 'rem') {
				AIimgSrc.push(message_Path + "model/rem/remu2048/texture_00.png");
			} else if (chooseLive2d === 'aoba') {
				AIimgSrc.push(message_Path + "model/aoba/textures/texture_00.png");
			} else if (chooseLive2d === 'hijiki') {
				AIimgSrc.push(message_Path + "model/hijiki/moc/hijiki.2048/texture_00.png");
			} else if (chooseLive2d === 'tororo') {
				AIimgSrc.push(message_Path + "model/tororo/moc/tororo.2048/texture_00.png");
			} else if (chooseLive2d === 'plt') {
				AIimgSrc.push(message_Path + "model/plt/moc/plt.2048/texture_00.png");
			}
			var images = [];
			var imgLength = AIimgSrc.length;
			var loadingNum = 0;
			for (var i = 0; i < imgLength; i++) {
				images[i] = new Image();
				images[i].src = AIimgSrc[i];
				images[i].onload = function () {
					loadingNum++;
					if (loadingNum === imgLength) {
						var live2dhidden = localStorage.getItem("live2dhidden");
						if (live2dhidden === "0") {
							setTimeout(function () {
								$('#open_live2d').fadeIn(200);
							}, 1300);
						} else {
							setTimeout(function () {
								$('#landlord').fadeIn(200);
							}, 1300);
						}
						let model = '';
						if (chooseLive2d === 'histoire') {
							model = message_Path + "model/histoire/model.json";
						} else if (chooseLive2d === 'rem') {
							model = message_Path + "model/rem/model.json";
						} else if (chooseLive2d === 'aoba') {
							model = message_Path + "model/aoba/model.json";
						} else if (chooseLive2d === 'hijiki') {
							model = message_Path + "model/hijiki/hijiki.model.json";
						} else if (chooseLive2d === 'tororo') {
							model = message_Path + "model/tororo/tororo.model.json";
						} else if (chooseLive2d === 'plt') {
							model = message_Path + "model/plt/model.json?v=1617466520";
						}
						setTimeout(function () {
							loadlive2d("live2d", model);
						}, 1000);
						initLive2d();
						images = null;
					}
				}
			}
		});
	}
</script>
  
  
</div>
<script>

  let sideBarOpen = 'sidebar-open';
  let body = document.body;
  let back2Top = document.querySelector('#back_to_top'),
    back2TopText = document.querySelector('#back_to_top_text'),
    drawerBox = document.querySelector('#drawer_box'),
    rightSideBar = document.querySelector('.sidebar'),
    viewport = document.querySelector('body');

  function scrollAnimation(currentY, targetY) {

    let needScrollTop = targetY - currentY
    let _currentY = currentY
    setTimeout(() => {
      const dist = Math.ceil(needScrollTop / 10)
      _currentY += dist
      window.scrollTo(_currentY, currentY)
      if (needScrollTop > 10 || needScrollTop < -10) {
        scrollAnimation(_currentY, targetY)
      } else {
        window.scrollTo(_currentY, targetY)
      }
    }, 1)
  }

  back2Top.addEventListener("click", function (e) {
    scrollAnimation(document.scrollingElement.scrollTop, 0);
    e.stopPropagation();
    return false;
  });

  window.addEventListener('scroll', function (e) {
    let percent = document.scrollingElement.scrollTop / (document.scrollingElement.scrollHeight - document.scrollingElement.clientHeight) * 100;
    if (percent > 1 && !back2Top.classList.contains('back-top-active')) {
      back2Top.classList.add('back-top-active');
    }
    if (percent == 0) {
      back2Top.classList.remove('back-top-active');
    }
    if (back2TopText) {
      back2TopText.textContent = Math.floor(percent);
    }
  });


  let hasCacu = false;
  window.onresize = function () {
    calcuHeight();
  }

  function calcuHeight() {
    // 动态调整站点概览高度
    if (!hasCacu && back2Top.classList.contains('pisces') || back2Top.classList.contains('gemini')) {
      let sideBar = document.querySelector('.sidebar');
      let navUl = document.querySelector('#site_nav');
      sideBar.style = 'margin-top:' + (navUl.offsetHeight + navUl.offsetTop + 15) + 'px;';
      hasCacu = true;
    }
  }
  calcuHeight();

  let open = false, MOTION_TIME = 300, RIGHT_MOVE_DIS = '320px';

  if (drawerBox) {
    let rightMotions = document.querySelectorAll('.right-motion');
    let right = drawerBox.classList.contains('right');

    let transitionDir = right ? "transition.slideRightIn" : "transition.slideLeftIn";

    let openProp, closeProp;
    if (right) {
      openProp = {
        paddingRight: RIGHT_MOVE_DIS
      };
      closeProp = {
        paddingRight: '0px'
      };
    } else {
      openProp = {
        paddingLeft: RIGHT_MOVE_DIS
      };
      closeProp = {
        paddingLeft: '0px'
      };
    }

    drawerBox.onclick = function () {
      open = !open;
      window.Velocity(rightSideBar, 'stop');
      window.Velocity(viewport, 'stop');
      window.Velocity(rightMotions, 'stop');
      if (open) {
        window.Velocity(rightSideBar, {
          width: RIGHT_MOVE_DIS
        }, {
          duration: MOTION_TIME,
          begin: function () {
            window.Velocity(rightMotions, transitionDir, {});
          }
        })
        window.Velocity(viewport, openProp, {
          duration: MOTION_TIME
        });
      } else {
        window.Velocity(rightSideBar, {
          width: '0px'
        }, {
          duration: MOTION_TIME,
          begin: function () {
            window.Velocity(rightMotions, {
              opacity: 0
            });
          }
        })
        window.Velocity(viewport, closeProp, {
          duration: MOTION_TIME
        });
      }
      for (let i = 0; i < drawerBox.children.length; i++) {
        drawerBox.children[i].classList.toggle('muse-line');
      }
      drawerBox.classList.toggle(sideBarOpen);
    }
  }

  // 链接跳转
  let newWindow = 'false'
  if (newWindow === 'true') {
    let links = document.querySelectorAll('.post-body a')
    links.forEach(item => {
      if (!item.classList.contains('btn')) {
        item.setAttribute("target", "_blank");
      }
    })
  }

  let faSearch = document.querySelector('#fa_search');
  faSearch && faSearch.addEventListener('click', function () {
    document.querySelector('#search_mask').style = ''
  })

  // 代码高亮
  hljs.initHighlightingOnLoad();
  
  // 离开当前页title变化
  var leaveTitle = "";
  if (leaveTitle) {
    document.addEventListener('visibilitychange', function () {
      if (document.visibilityState == 'hidden') {
        normal_title = document.title;
        document.title = leaveTitle;
      } else {
        document.title = normal_title;
      }
    });
  }

</script>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />
<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>

<script>
  let images = document.querySelectorAll('.section img');
  console.log(images);
  images.forEach(image => {
    if (image.classList.contains('no-fancybox')) {
      return;
    }

    var parent = image.parentElement;
    var next = image.nextElementSibling;
    parent.removeChild(image);
    var aelem = document.createElement('a');
    aelem.href = image.src;
    aelem.dataset['fancybox'] = 'images';
    aelem.dataset['rel'] = 'fancybox-button';
    aelem.classList.add('fancybox');
    aelem.appendChild(image);
    parent.insertBefore(aelem, next);
  })
</script>
    <div class="reward-mask" style="display: none;">
  <div class="reward-relative">
    <span class="close" aria-hidden="true">x</span>
    <div class="reward-body">
      <h2>感谢您的支持，我会继续努力的!</h2>
      <div class="reward-img-box">
        <div style="position: relative; width: 140px; height: 140px;">
          
          
          
        </div>
      </div>
      <p class="reward-word">扫码打赏，你说多少就多少</p>
      <p class="reward-tip">打开微信扫一扫，即可进行扫码打赏哦</p>
    </div>
    <div class="bottom">
      
      
    </div>
  </div>
</div>
<style>
  .reward-mask {
    position: fixed;
    z-index: 99999;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background-color: #00000054;
  }

  .reward-relative {
    position: relative;
    width: 480px;
    text-align: center;
    margin: 0 auto;
    border-radius: 5px;
    background-color: #fff;
    top: 50%;
    margin-top: -205px;
  }

  .reward-relative .close {
    position: absolute;
    right: 10px;
    font-weight: normal;
    font-size: 16px;
    color: #929292;
  }

  .reward-body {
    padding: 40px 20px 20px;
  }

  .bottom {
    display: flex;
  }

  .reward-btn {
    text-align: center;
  }

  .reward-btn-text {
    display: inline-block;
    cursor: pointer;
    width: 60px;
    height: 60px;
    line-height: 60px;
    border-radius: 50%;
    background-color: #ff9734;
    color: #FFF;
    margin-top: 20px;
  }

  .pay-text {
    margin-top: 10px;
    padding: 10px;
    flex: 1;
    transition: all .2s linear;
  }

  .pay-text:hover {
    background-color: #a5a5a536;
  }

  .reward-body h2 {
    padding-top: 10px;
    text-align: center;
    color: #a3a3a3;
    font-size: 16px;
    font-weight: normal;
    margin: 0 0 20px;
  }

  .reward-body h2:after,
  .reward-body h2:before {
    font-family: Arial, Helvetica, sans-serif;
    background: 0 0;
    width: 0;
    height: 0;
    font-style: normal;
    color: #eee;
    font-size: 80px;
    position: absolute;
    top: 20px;
  }

  .reward-body h2:before {
    content: '\201c';
    left: 50px;
  }

  .reward-body h2:after {
    content: '\201d';
    right: 80px;
  }

  .reward-img-box {
    display: inline-block;
    padding: 10px;
    border: 6px solid #ea5f00;
    margin: 0 auto;
    border-radius: 3px;
    position: relative;
  }

  .reward-img {
    position: absolute;
    left: 0px;
    top: 0px;
    width: 100%;
    height: 100%;
  }

  @media (max-width: 767px) {
    .reward-relative {
      height: 100%;
      top: 0px;
      margin-top: 0;
      width: auto;
    }

    .reward-relative .bottom {
      flex-direction: column;
    }

    .reward-relative .pay-text {
      width: 80%;
      margin: 5px auto;
      border: 1px solid silver;
      padding: 6px;
      border-radius: 4px;
    }

    .reward-body h2:after {
      right: 40px;
    }

    .reward-body h2:after,
    .reward-body h2:before {
      font-size: 60px;
    }

    .reward-body h2:before {
      left: 20px;
    }
  }
</style>
<script>
  !function () {
    var mask = document.querySelector('.reward-mask');
    let close = document.querySelector('.reward-relative .close');
    let rewardBtn = document.querySelector('.reward-btn');

    let zfb = document.querySelector('#zfb'),
      wx = document.querySelector('#wx'),
      zfbBtn = document.querySelector('#zfbBtn'),
      wxBtn = document.querySelector('#wxBtn');

    if (zfbBtn && wxBtn) {
      zfbBtn.addEventListener('click', () => {
        window.Velocity(zfb, 'transition.slideLeftIn', {
          duration: 400
        });
        window.Velocity(wx, 'transition.slideRightOut', {
          display: 'none',
          duration: 400
        });
      });

      wxBtn.addEventListener('click', () => {
        window.Velocity(wx, 'transition.slideRightIn', {
          duration: 400
        });
        window.Velocity(zfb, 'transition.slideLeftOut', {
          display: 'none',
          duration: 400
        });
      });
    }

    rewardBtn && rewardBtn.addEventListener('click', (e) => {
      window.Velocity(mask, 'transition.slideDownIn', {
        duration: 400
      })
    });

    close.addEventListener('click', (e) => {
      e.preventDefault();
      window.Velocity(mask, 'transition.slideUpOut', {
        duration: 400
      })
    })
  }()
</script>

  </div>
</body>

<input hidden id="copy" />
<script>
  !function () {
    let times = document.querySelectorAll('.publish-time');
    for (let i = 0; i < times.length; i++) {
      let date = times[i].dataset.t;
      let time = Math.floor((new Date().getTime() - new Date(date).getTime()) / 1000);
      if (time < 60) {
        str = time + '秒之前';
      } else if (time < 3600) {
        str = Math.floor(time / 60) + '分钟之前';
      } else if (time >= 3600 && time < 86400) {
        str = Math.floor(time / 3600) + '小时之前';
      } else if (time >= 86400 && time < 259200) {
        str = Math.floor(time / 86400) + '天之前';
      } else {
        str = times[i].textContent;
      }
      times[i].textContent = str;
    }
  }();
</script>

<script>
  let language = '';
  if (language !== '') {
    let map = new Map();
    if (language === 'en') {
      map.set('search', 'Search');
      map.set('category', 'Categories');
      map.set('article', 'Articles');
      map.set('tag', 'Tags');
      map.set('top', 'Top');
      map.set('publish', 'published');
      map.set('minute', ' minutes');
      map.set('read-more', 'Read More');
      map.set('view', 'View');
      map.set('words', ' words');
      map.set('category-in', 'category in');
      map.set('preview', 'Meta');
      map.set('index', 'Toc');
      map.set('no-archives', "You haven't created yet");
      map.set('archives', " articles in total");
      map.set('cloud-tags', " tags in total");
      map.set('copyright', "Copyright: ");
      map.set('author', "Author: ");
      map.set('link', "Link: ");
      map.set('leave-message', "Leave a message");
      map.set('format', "Links Format");
      map.set('site-name', "Name: ");
      map.set('site-link', "Link: ");
      map.set('site-desc', "Desc: ");
      map.set('stat', " related results, taking ");
      map.set('stat-time', " ms");
      map.set('site-img', "Image: ");
    }

    if (map.size > 0) {
      let lanElems = document.querySelectorAll('.language');
      lanElems.forEach(elem => {
        let lan = elem.dataset.lan, text = map.get(lan);
        if (elem.__proto__ === HTMLInputElement.prototype) {
          elem.placeholder = text
        } else {
          if (elem.dataset.count) {
            text = elem.dataset.count + text;
          }
          elem.textContent = text;
        }
      })
    }
  }
  //拿来主义(真香)^_^，Clipboard 实现摘自掘金 https://juejin.im/post/5aefeb6e6fb9a07aa43c20af
  window.Clipboard = (function (window, document, navigator) {
    var textArea,
      copy;

    // 判断是不是ios端
    function isOS() {
      return navigator.userAgent.match(/ipad|iphone/i);
    }
    //创建文本元素
    function createTextArea(text) {
      textArea = document.createElement('textArea');
      textArea.value = text;
      textArea.style.width = 0;
      textArea.style.height = 0;
      textArea.clientHeight = 0;
      textArea.clientWidth = 0;
      document.body.appendChild(textArea);
    }
    //选择内容
    function selectText() {
      var range,
        selection;

      if (isOS()) {
        range = document.createRange();
        range.selectNodeContents(textArea);
        selection = window.getSelection();
        selection.removeAllRanges();
        selection.addRange(range);
        textArea.setSelectionRange(0, 999999);
      } else {
        textArea.select();
      }
    }

    //复制到剪贴板
    function copyToClipboard() {
      try {
        document.execCommand("Copy")
      } catch (err) {
        alert("复制错误！请手动复制！")
      }
      document.body.removeChild(textArea);
    }

    copy = function (text) {
      createTextArea(text);
      selectText();
      copyToClipboard();
    };

    return {
      copy: copy
    };
  })(window, document, navigator);

  function copyCode(e) {
    if (e.srcElement.tagName === 'SPAN' && e.srcElement.classList.contains('copy-code')) {
      let code = e.currentTarget.querySelector('code');
      var text = code.innerText;
      if (e.srcElement.textContent === '复制成功') {
        return;
      }
      e.srcElement.textContent = '复制成功';
      (function (elem) {
        setTimeout(() => {
          if (elem.textContent === '复制成功') {
            elem.textContent = '复制代码'
          }
        }, 1000);
      })(e.srcElement)
      Clipboard.copy(text);
    }
  }

  let pres = document.querySelectorAll('pre');
  pres.forEach(pre => {
    let code = pre.querySelector('code');
    let copyElem = document.createElement('span');
    copyElem.classList.add('copy-code');
    copyElem.textContent = '复制代码';
    pre.appendChild(copyElem);
    pre.onclick = copyCode
  })

</script>
<script src="/media/js/motion.js"></script>


<script src="https://cdn.jsdelivr.net/gh/cferdinandi/smooth-scroll/dist/smooth-scroll.polyfills.min.js"></script>
<script>
  var scroll = new SmoothScroll('a[href*="#"]', {
    speed: 200
  });
</script>



<script src="/media/js/cool.js"></script>



</html>